SQL-窗口函数DENSE_RANK 和 RANK的区别

DENSE_RANK 和 RANK 都是 SQL 中的窗口函数,用于为结果集中的行分配排名,但它们在处理并列排名时的方式不同。以下是它们的区别及示例说明:

‌1. RANK 函数‌

  • ‌特点‌:当出现并列排名时,‌后续排名会跳过被占用的名次‌。
  • ‌示例‌:
    假设数据为 [100, 100, 90, 80, 80, 70]
    SELECT 分数, RANK() OVER (ORDER BY 分数 DESC) AS rank FROM 成绩表;
    ‌结果‌:
    分数 | rank
    ------------
    100 | 1
    100 | 1
    90 | 3 -- 跳过第2名
    80 | 4
    80 | 4
    70 | 6 -- 跳过第5名

 

‌2. DENSE_RANK 函数‌

  • ‌特点‌:当出现并列排名时,‌后续排名不跳过名次‌,保持连续。
  • ‌示例‌:
    同样数据 [100, 100, 90, 80, 80, 70]
    SELECT 分数, DENSE_RANK() OVER (ORDER BY 分数 DESC) AS dense_rank FROM 成绩表;
    ‌结果‌:
    分数 | dense_rank
    ------------
    100 | 1
    100 | 1
    90 | 2 -- 不跳过名次
    80 | 3
    80 | 3
    70 | 4 -- 保持连续

对比总结‌

场景RANK 结果DENSE_RANK 结果
前两名并列第一 1,1,3 1,1,2
后续并列不影响连续性 跳过名次 保持名次连续

应用场景‌

  • ‌RANK‌:适用于允许排名空缺的场景(如比赛名次)。
  • ‌DENSE_RANK‌:适用于需要连续排名的场景(如等级划分)。
posted @ 2025-04-16 10:34  业余砖家  阅读(361)  评论(0)    收藏  举报