You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为简单的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 11:24:35