请求编写SQL:找出各商品购买量Top2客户及最近购买日期
解决方法
首先我们需要先统计每个客户针对每个商品的总购买量(以总revenue计算),同时记录该客户购买该商品的最近日期,之后通过窗口函数对每个商品下的客户按总购买量排序,筛选出排名前2的记录。
示例SQL语句
WITH customer_item_stats AS ( SELECT customer_id, item, SUM(revenue) AS total_purchase_volume, MAX(created_at) AS latest_purchase_date FROM purchases GROUP BY customer_id, item ), ranked_customers AS ( SELECT item, customer_id, latest_purchase_date, total_purchase_volume, ROW_NUMBER() OVER (PARTITION BY item ORDER BY total_purchase_volume DESC) AS purchase_rank FROM customer_item_stats ) SELECT item, customer_id, latest_purchase_date, total_purchase_volume FROM ranked_customers WHERE purchase_rank <= 2 ORDER BY item, purchase_rank;
语句说明
- CTE
customer_item_stats:按客户和商品分组,计算每个客户对应商品的总购买量(总revenue),并取该客户购买该商品的最近日期。 - CTE
ranked_customers:使用ROW_NUMBER()窗口函数,按商品分组,对每个商品下的客户按总购买量降序排名。如果需要处理并列排名(比如两个客户总购买量相同都排第1),可以替换窗口函数:RANK():并列的会有相同排名,后续排名会跳跃(例如两个第1,下一个是第3)DENSE_RANK():并列的相同排名,后续排名不跳跃(例如两个第1,下一个是第2)
- 最后筛选出排名≤2的记录,按商品和排名排序输出。
针对给定数据集的输出结果
基于你提供的数据集,执行上述SQL后会得到:
| item | customer_id | latest_purchase_date | total_purchase_volume |
|---|---|---|---|
| apple | 3 | 3/18/2022 | 76 |
| apple | 1 | 3/28/2022 | 56 |
| banana | 4 | 3/18/2022 | 62 |
| banana | 1 | 3/7/2022 | 52 |
| peanut | 3 | 3/31/2022 | 88 |
| peanut | 1 | 3/30/2022 | 29 |
| pear | 2 | 3/18/2022 | 21 |
内容的提问来源于stack exchange,提问作者zzzTeee
相关产品推荐
相关产品推荐

