SQL Server 中四大排序方法:ROW_NUMBER(),RANK(),DENSE_RANK(),NTILE()

由于数据过多,截取部分测试数据 如下:

select TOP 6  GradeNO,GradeName from BasGradeInfo ORDER BY GradeName ASC

数据

1、ROW_NUMBER()

定义:ROW_NUMBER()函数作用就是将SELECT查询到的数据进行排序,每一条数据加一个序号,他不能用做于数据的排名,一般多用于分页查询。

示例:

select TOP 6 ROW_NUMBER() OVER (ORDER BY GradeName ASC) AS [ROW_NUMBER], GradeNO,GradeName from BasGradeInfo

结果:
在这里插入图片描述

这里ROW_NUMBER就是每个等级名称的排名后的次序, 根据GradeName进行ASC排序

2、RANK()

定义:RANK()函数,顾名思义排名函数,可以对某一个字段进行排名,这里和ROW_NUMBER()有什么不一样呢?ROW_NUMBER()是排序,当存在相同等级名称时,ROW_NUMBER()会依次进行排序,他们序号不相同,而Rank()则不一样。如果出现相同的,他们的排名是一样的。

示例:

select TOP 6 RANK() OVER (ORDER BY GradeName ASC) AS [RANK], GradeNO,GradeName from BasGradeInfo  

结果:
在这里插入图片描述

ROW_NUMBER()  RANK() 排序结果对比

在这里插入图片描述

3、DENSE_RANK()

定义:DENSE_RANK()函数也是排名函数,和RANK()功能相似,也是对字段进行排名,那它和RANK()到底有什么不同那?特别是对于有相同的情况,DENSE_RANK()排名是连续的,RANK()是跳跃的排名,一般情况下用的排名函数就是RANK() 。

示例:

select TOP 6 DENSE_RANK() OVER (ORDER BY GradeName ASC) AS [DENSE_RANK], GradeNO,GradeName from BasGradeInfo

结果:
在这里插入图片描述

RANK()  DENSE_RANK() 排序结果对比

在这里插入图片描述

4、NTILE()

定义:NTILE()函数可以对序号进行分组处理,将有序分区中的行分发到指定数目的组中。 各个组有编号,编号从一开始。 对于每一个行,NTILE将返回此行所属的组的编号。这就相当于将查询出来的记录集放到指定长度的数组中,每一个数组元素存放一定数量的记录。

示例:

select  NTILE(3) OVER (ORDER BY GradeName ASC) AS [NTILE], GradeNO,GradeName from BasGradeInfo WHERE GradeNO IN('G079','G064','G042','G044','G043','G031')

结果:
在这里插入图片描述
示例:

select  NTILE(4) OVER (ORDER BY GradeName ASC) AS [NTILE], GradeNO,GradeName from BasGradeInfo WHERE GradeNO IN('G079','G064','G042','G044','G043','G031')

结果:
在这里插入图片描述
NTILE函数的分组依据(约定):

1. 每组的记录数不能大于它上一组的记录数,即编号小的分组放的记录数不能小于编号大的分组。也就是说,第1组中的记录数只能大于等于第2组及以后各组中的记录数。
2. 所有组中的记录数要么都相同,要么从某一个记录较少的组(命名为X)开始后面所有组的记录数都与该组(X组)的记录数相同。也就是说,如果有个组,前三组的记录数都是9,而第四组的记录数是8,那么第五组和第六组的记录数也必须是8。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐