如何为简单的GROUP BY查询添加排名行号
如何为简单的GROUP BY查询添加排名行号
嘿,我来帮你搞定这个排名的问题!你之前用ROW_NUMBER()的时候踩了个小坑——排序条件没写对,所以行号才会看起来随机。
先理清楚问题:你已经通过GROUP BY统计出了每个名字的出现频率,现在需要给这些结果按频率从高到低加上排名序号。之前的ROW_NUMBER() OVER (ORDER BY (SELECT 1))之所以乱,是因为(SELECT 1)相当于告诉数据库“随便按什么顺序排序都行”,数据库会用它认为高效的无序方式处理,自然得不到你要的排名。
下面给你几种不同需求的解决方案:
1. 基础唯一排名(同频率也会有不同行号)
如果不管频率是否相同,都想要连续的唯一行号,用ROW_NUMBER()搭配正确的排序条件即可:
SELECT ROW_NUMBER() OVER (ORDER BY Frequency DESC) AS Rank, Name, Frequency FROM ( -- 这部分是你原有的分组统计逻辑 SELECT name AS Name, COUNT(name) AS Frequency FROM table GROUP BY name ) AS grouped_results ORDER BY Frequency DESC;
这里先把分组统计的结果作为子查询,在外层通过ROW_NUMBER()按Frequency DESC排序生成行号,这样就能得到从1开始、按频率高低排序的正确排名。
2. 同频率共享排名(会跳号)
如果希望频率相同的名字拥有相同排名,且后续排名跳过重复的序号(比如两个第1名之后,下一个直接是第3名),就用RANK():
SELECT RANK() OVER (ORDER BY Frequency DESC) AS Rank, Name, Frequency FROM ( SELECT name AS Name, COUNT(name) AS Frequency FROM table GROUP BY name ) AS grouped_results ORDER BY Frequency DESC;
3. 同频率共享排名(不跳号)
要是你想让同频率的名字共享排名,且后续排名保持连续(两个第1名之后,下一个是第2名),就用DENSE_RANK():
SELECT DENSE_RANK() OVER (ORDER BY Frequency DESC) AS Rank, Name, Frequency FROM ( SELECT name AS Name, COUNT(name) AS Frequency FROM table GROUP BY name ) AS grouped_results ORDER BY Frequency DESC;
你可以根据自己的实际需求选择对应的函数,核心就是一定要在OVER()子句里指定ORDER BY Frequency DESC,这样排名才会和你想要的频率顺序一致~
备注:内容来源于stack exchange,提问作者Madje Kolak
相关产品推荐
相关产品推荐

