【发布时间】:2020-07-22 16:05:22
【问题描述】:
我有一个如下所示的销售表:
store_id cust_id txn_id txn_date amt industry
200 1 1 20180101 21.01 1000
200 2 2 20200102 20.01 1000
200 2 3 20200103 19 1000
200 3 4 20180103 19 1000
200 4 5 20200103 21.01 1000
300 2 6 20200104 1.39 2000
300 1 7 20200105 12.24 2000
300 1 8 20200105 25.02 2000
400 2 9 20180106 103.1 1000
400 2 10 20200107 21.3 1000
这是生成此示例表的代码:
CREATE TABLE sales(
store_id INT,
cust_id INT,
txn_id INT,
txn_date bigint,
amt float,
industry INT);
INSERT INTO sales VALUES(200,1,1,20180101,21.01,1000);
INSERT INTO sales VALUES(200,2,2,20200102,20.01,1000);
INSERT INTO sales VALUES(200,2,3,20200103,19.00,1000);
INSERT INTO sales VALUES(200,3,4,20180103,19.00,1000);
INSERT INTO sales VALUES(200,4,5,20200103,21.01,1000);
INSERT INTO sales VALUES(300,2,6,20200104,1.39,2000);
INSERT INTO sales VALUES(300,1,7,20200105,12.24,2000);
INSERT INTO sales VALUES(300,1,8,20200105,25.02,2000);
INSERT INTO sales VALUES(400,2,9,20180106,103.1,1000);
INSERT INTO sales VALUES(400,2,10,20200107,21.3,1000);
我想做的是创建一个新表 results 来回答以下问题:自 2020 年 1 月 3 日以来,我的 VIP 客户中有多少百分比只在我的商店购物 i); ii) 在我的商店和同行业的其他商店; iii) 仅在同行业的其他商店?将 VIP 客户定义为自 2019 年以来至少在指定商店购物过一次的人。
这是目标输出表:
store industry pct_my_store_only pct_both pct_other_stores_only
200 1000 0.5 0.5 0.0
300 2000 0.5 0.5 0.0
400 1000 0.0 1.0 0.0
我正在尝试使用窗口函数来完成此操作。到目前为止,这是我所拥有的:
CREATE TABLE results as
SELECT s.store_id, s.industry,
COUNT(DISTINCT (CASE WHEN s.txn_date>=20200103 THEN s.cust_id END)) * 1.0 / sum(count(DISTINCT (CASE WHEN s.txn_date>=20200103 THEN s.cust_id END))) OVER (PARTITION BY s.industry) AS pct_my_store_only
...AS pct_both
...AS pct_other_stores_only
FROM sales s
WHERE sales.txn_date>=20190101
GROUP BY s.store_id, s.industry;
以上似乎不正确;我该如何纠正这个问题?
【问题讨论】:
-
请向我们展示您的样本数据所需的结果(您有 3 个空列)
-
@GMB:谢谢,我已经完成了目标表并添加了一个只在商店 200 购物的新客户(客户 4)。
-
@Caerus 当你说,你的商店?你指的是哪一个?
-
@JagaSrik:我的意思是每家商店都有一组自 2019 年以来在该商店购物的 VIP 客户。在这些客户中,谁只在该商店购物?例如,商店 200 有 2 个 VIP 客户(客户 2、4)。其中,只有客户 4 自 2020 年 1 月 3 日起仅在 200 家商店购物。另一位也在同行业(行业 1000)的其他商店购物。
-
VIP客户的定义是什么?