SQL Server 中四大排序方法:ROW_NUMBER(),RANK(),DENSE_RANK(),NTILE()
由于数据过多,截取部分测试数据 如下:
select TOP 6 GradeNO,GradeName from BasGradeInfo ORDER BY GradeName ASC
定义:ROW_NUMBER()函数作用就是将SELECT查询到的数据进行排序,每一条数据加一个序号,他不能用做于数据的排名,一般多用于分页查询。
示例:
select TOP 6 ROW_NUMBER() OVER (ORDER BY GradeName ASC) AS [ROW_NUMBER], GradeNO,GradeName from BasGradeInfo
这里ROW_NUMBER就是每个等级名称的排名后的次序, 根据GradeName进行ASC排序
定义: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() 排序结果对比
定义: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() 排序结果对比
定义: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')
1. 每组的记录数不能大于它上一组的记录数,即编号小的分组放的记录数不能小于编号大的分组。也就是说,第1组中的记录数只能大于等于第2组及以后各组中的记录数。
2. 所有组中的记录数要么都相同,要么从某一个记录较少的组(命名为X)开始后面所有组的记录数都与该组(X组)的记录数相同。也就是说,如果有个组,前三组的记录数都是9,而第四组的记录数是8,那么第五组和第六组的记录数也必须是8。