在SQL中,ROW_NUMBER()
、DENSE_RANK()
和RANK()
都是窗口函数,用于对数据进行排序和排名,但它们之间存在一些关键区别。以下是这三个函数的详细比较:
一、ROW_NUMBER()
-
功能:为结果集中的每一行分配一个唯一的连续编号。
-
特点:
- 编号从1开始,并且每行一个唯一的编号,不会重复。
-
如果有两行或多行的排序值相同,它们仍然会被分配不同的编号。
- 常用于分页查询和排名计算。
-
姓名 成绩 排名 小明 95 1 小王 94 2 小红 93 3 小杰 93 4
二、DENSE_RANK()
-
功能:对数据进行排序并处理相同值的排名。
-
特点:
- 如果两行或多行的排序值相同,它们会被分配相同的排名。
- 与
ROW_NUMBER()
不同,DENSE_RANK()
在分配排名时不会跳过任何数字。即如果有两个排名相同的行,下一个行的排名将是紧接着的下一个数字,而不是跳过。 - 例如,如果两行都是第一名,则下一行的排名将是第二名,而不是第三名。
-
姓名 成绩 排名 小明 95 1 小王 94 2 小红 93 3 小杰 93 3 小龙 90 4
三、RANK()
-
功能:对数据进行排序并处理相同值的排名。
-
特点:
- 如果两行或多行的排序值相同,它们会被分配相同的排名。
- 与
DENSE_RANK()
不同,RANK()
在分配排名时会跳过数字。即如果有两个排名相同的行,下一个行的排名将是跳过相同排名后的下一个数字。 - 例如,如果两行都是第一名,则下一行的排名将是第三名,而不是第二名(因为第二名被跳过了)。
-
姓名 成绩 排名 小明 95 1 小王 94 2 小红 93 3 小杰 93 3 小龙 90 5 小刚 88 6
四、总结
- 唯一编号:
ROW_NUMBER()
为每行分配唯一的连续编号,不会重复。 - 连续排名:
DENSE_RANK()
在相同排序值的情况下分配相同的排名,并且排名是连续的。