以这个表为例,解释四大排序函数的区别。
id | num |
1 | 2 |
2 | 3 |
3 | 6 |
4 | 4 |
5 | 10 |
6 | 4 |
1.ROW_NUMBER():
在排序的时候,ROW_NUMBER():按照指定的顺序排序,为每一行分配一个连续的、唯一的整数值,这意味着即使有相同的排序值,每行的排名也是唯一的。
select *,row_number() OVER(order by num ) as row_num
from num
结果如下(注意num相同的值,row_num值不一样)
id | num | row_num |
1 | 2 | 1 |
2 | 3 | 2 |
4 | 4 | 3 |
6 | 4 | 4 |
3 | 6 | 5 |
5 | 10 | 6 |
2.RANK()
rank函数是排名函数。rank函数最常用的是求某一个数值在某一区域的排名。即返回一个数字的排位是其大小与列表中其他值的比值,如果列表已排过序,则数字的排位就是它当前的位置。
select *,rank() OVER(order by num ) as row_num
from num
结果如下,注意num相同的值,row_num一样,但是不影响接下来排序,如下row_num两个3后面直接是5,即排名是不连续的。
id | num | row_num |
1 | 2 | 1 |
2 | 3 | 2 |
4 | 4 | 3 |
6 | 4 | 3 |
3 | 6 | 5 |
5 | 10 | 6 |
3.DENSE_RANK()
RENSE_RANK()函数排名连续,不会跳过相同的值的行。也就是具有多个相同的值,会被分配相同的排名,后面的排名紧接排名后面,不会跳过相同值的函数。
select *,DENSE_RANK() OVER(order by num ) as row_num
from num
结果如下和RANK()很像,但是排名连续
id | num | row_num |
1 | 2 | 1 |
2 | 3 | 2 |
4 | 4 | 3 |
6 | 6 | 3 |
3 | 6 | 4 |
5 | 10 | 5 |
4.NTILE()
NTILE()比较特殊,NTILE(group_num)将结果集分成group_num个组,并为每一个组分配一个序号,使得每个组的行数尽可能平均,如果行数不能被group_num整除,则前几个组的行数将比后面的组多一个。NTILE() 返回的序号从1到group_num。
select *,NTILE(3) OVER(order by num ) as row_num
from num
结果如下,把这个排序后的数平均分成了三组。
id | num | row_num |
1 | 2 | 1 |
2 | 3 | 1 |
4 | 4 | 2 |
6 | 4 | 2 |
3 | 6 | 3 |
5 | 10 | 3 |
这就是这四个排序函数的基本区别,学习任重而道远,咱们一起加油。