跳到主要内容

简述row_number(),rank()和dense_rank()的区别 ?

参考答案:

ROW_NUMBER(), RANK(), 和 DENSE_RANK() 是 SQL 中的窗口函数,主要用于对查询结果的行进行排序和编号。它们的主要区别在于处理具有相同排序值的行时如何编号。

  1. ROW_NUMBER():

    • ROW_NUMBER() 为结果集的每一行分配一个唯一的序号。
    • 即使两行或多行具有相同的排序值,它们也会被赋予连续的、不重复的序号。
    • 它不保留并列的排名。
  2. RANK():

    • RANK() 为结果集的每一行分配一个排名。
    • 如果两行或多行具有相同的排序值,它们会获得相同的排名。
    • 但是,在下一个不同的排序值处,排名会有跳跃。例如,如果有两行都排名第一,那么下一行的排名将是第三,而不是第二。
    • 这意味着可能存在排名之间的间隙。
  3. DENSE_RANK():

    • DENSE_RANK() 的行为与 RANK() 类似,但在处理并列排名时有所不同。
    • 如果两行或多行具有相同的排序值,它们会获得相同的排名。
    • 但是,与 RANK() 不同,DENSE_RANK() 在下一个不同的排序值处不会跳过任何排名。例如,如果有两行都排名第一,那么下一行的排名将是第二,而不是第三。
    • 这意味着排名是连续的,没有间隙。

示例:

假设我们有一个包含学生分数的数据集,并且我们想要根据分数对学生进行排名。

SELECT student_name, score,
       ROW_NUMBER() OVER (ORDER BY score DESC) as row_num,
       RANK() OVER (ORDER BY score DESC) as rank,
       DENSE_RANK() OVER (ORDER BY score DESC) as dense_rank
FROM student_scores;
  • 如果两名学生获得相同的最高分数,ROW_NUMBER() 会为他们分配不同的序号。
  • RANK() 会为他们分配相同的排名,但下一个学生的排名会有跳跃。
  • DENSE_RANK() 也会为他们分配相同的排名,但下一个学生的排名是连续的,没有跳跃。