简述row_number(),rank()和dense_rank()的区别 ?
参考答案:
ROW_NUMBER()
, RANK()
, 和 DENSE_RANK()
是 SQL 中的窗口函数,主要用于对查询结果的行进行排序和编号。它们的主要区别在于处理具有相同排序值的行时如何编号。
-
ROW_NUMBER():
ROW_NUMBER()
为结果集的每一行分配一个唯一的序号。- 即使两行或多行具有相同的排序值,它们也会被赋予连续的、不重复的序号。
- 它不保留并列的排名。
-
RANK():
RANK()
为结果集的每一行分配一个排名。- 如果两行或多行具有相同的排序值,它们会获得相同的排名。
- 但是,在下一个不同的排序值处,排名会有跳跃。例如,如果有两行都排名第一,那么下一行的排名将是第三,而不是第二。
- 这意味着可能存在排名之间的间隙。
-
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()
也会为他们分配相同的排名,但下一个学生的排名是连续的,没有跳跃。