如何按group_name分组获取各品类Top10销售商品?
获取每个商品组下的Top10销量商品
要实现每个group_name下取Top10销量商品,核心是用窗口函数对每个商品组内部的商品按销量排序并排名,再筛选排名前10的记录。以下是修改后的查询:
SELECT * FROM ( SELECT cs.item_no, SUM(cs.quantity) AS total_quantity, i.item_type, i.item_name, i.group_name, -- 按商品组分隔,对每个组内的商品按销量降序排名 ROW_NUMBER() OVER (PARTITION BY i.group_name ORDER BY SUM(cs.quantity) DESC) AS rank_in_group FROM `sales` cs LEFT JOIN ( SELECT item_no, MIN(item_name) AS item_name, MIN(item_type) AS item_type, MIN(group_name) AS group_name FROM `items` WHERE group_name != 'UNKNOWN' GROUP BY item_no ) i ON cs.item_no = i.item_no WHERE cs.date BETWEEN '2022-08-21' AND '2022-08-22' GROUP BY cs.item_no, i.item_type, i.item_name, i.group_name ) ranked_items WHERE rank_in_group <= 10 ORDER BY group_name, rank_in_group;
关键修改点说明:
- 新增窗口函数:使用
ROW_NUMBER() OVER (PARTITION BY i.group_name ORDER BY SUM(cs.quantity) DESC),其中:PARTITION BY i.group_name:将数据按商品组拆分,每个组单独计算排名ORDER BY SUM(cs.quantity) DESC:在每个组内按总销量从高到低排序
- 筛选排名:外层查询添加
WHERE rank_in_group <= 10,只保留每个组内排名前10的商品 - 排序优化:最终结果按
group_name和rank_in_group排序,方便查看每个组的Top10顺序
排名函数选择(按需调整):
- 如果需要并列排名(比如销量相同的商品共享同一排名,下一个商品排名顺延),可以把
ROW_NUMBER()换成RANK() - 如果需要连续并列排名(销量相同的商品共享同一排名,下一个商品排名连续),可以换成
DENSE_RANK()
内容的提问来源于stack exchange,提问作者Thelonious Monk
相关产品推荐
相关产品推荐

