如何在SQL中按分类分组计算各品牌的排名?
按Category分组计算Brand的排名问题
给定table1表数据如下:
Category Brand Value A A1 4 B B1 7 C C1 8 A A2 3 B B2 4 C C2 6 A A3 9 B B3 10 C C3 1 A A4 5
需求是按Category分组,每组内根据Value降序为Brand计算排名,期望输出:
Category Brand Value Rank A A3 9 1 A A4 5 2 A A1 4 3 A A2 3 4 B B3 10 1 B B1 7 2 B B2 4 3 C C1 8 1 C C2 6 2 C C3 1 3
你之前尝试的SQL写法有误,GROUP BY是用于聚合数据的操作,无法实现组内逐行排名的需求,正确的方式是使用窗口函数:
SELECT Category, Brand, Value, RANK() OVER (PARTITION BY Category ORDER BY Value DESC) AS Rank FROM table1 ORDER BY Category, Rank;
关键说明:
PARTITION BY Category:指定按Category字段分组,每个Category单独计算排名ORDER BY Value DESC:定义组内排序规则,按Value从高到低排序,排名1对应组内最大的Value- 若需要连续排名(即使存在相同Value也不跳过名次),可替换
RANK()为DENSE_RANK();若需要每行唯一排名(忽略Value重复),则用ROW_NUMBER()
执行上述SQL即可得到你期望的输出结果。
内容的提问来源于stack exchange,提问作者Santosh Sharma
相关产品推荐
相关产品推荐

