介绍:
在sql中,有三种常用的排序类窗口函数,它们分别是rank()、dense_rank()和row_number()。这些函数用于根据指定的排序规则在结果集中为每一行分配一个排名。
rank()函数:rank()函数根据指定的排序规则为每一行分配一个排名,如果有相同的值,则会跳过下一个排名。也就是说,如果有两个行具有相同的排序值,并且排名为1,则下一个排名将会是3。因此,rank()函数可能会产生不连续的排名。
dense_rank()函数:dense_rank()函数根据指定的排序规则为每一行分配一个排名,它会跳过下一个排名的空位。换句话说,如果有两个行具有相同的排序值,并且排名为1,则下一个排名将会是2,而不是3。因此,dense_rank()函数会产生连续的排名。
row_number()函数:row_number()函数为结果集中的每一行分配一个唯一的整数值,没有跳过或重复的排名。它不考虑具体的排序规则,只是按照结果集的顺序为每一行分配一个排名。因此,row_number()函数会产生连续的整数排名,不会处理有相同排序值的行。
排序类窗口函数详细介绍可以看如下链接:
举例:
下面是一个示例,展示如何使用这些排序类窗口函数:
假设我们有一个名为 scores 的表,其中包含学生的成绩信息,如学生姓名(name)和分数(score),我们想要根据分数对学生进行排名。表格信息如下:
name | score |
---|---|
alice | 90 |
bob | 85 |
charlie | 90 |
david | 80 |
emily | 95 |
运行以下查询可以得到排序类窗口函数的结果:
select name, score,
rank() over (order by score desc) as rank,
dense_rank() over (order by score desc) as denserank,
row_number() over (order by score desc) as rownumber
from scores;
结果如下:
name | score | rank | dense_rank | row_number |
---|---|---|---|---|
emily | 95 | 1 | 1 | 1 |
alice | 90 | 2 | 2 | 2 |
charlie | 90 | 2 | 2 | 3 |
bob | 85 | 4 | 3 | 4 |
david | 80 | 5 | 4 | 5 |
在这个结果中,根据分数的降序排列,emily的分数最高,因此她的排名为第1名。alice和charlie的分数相同,因此它们的排名都是第2名。bob的分数次于alice和charlie,排名为第4名。david的分数最低,因此他的排名为第5名。
denserank列显示了连续的排名,即使有相同的分数也没有跳过下一个号码。rownumber列则只是按照结果集的顺序为每个行分配了一个唯一的整数值。
从这个结果表就可以很好的看出三个排序类窗口函数的区别:
- rank和dense_rank的区别:
- row_number: