在做开发的时候,排名函数是sqlserver经常用到的函数,在分页的时候需要用,分组的时候也要用,主要排名函数有row-number,rank(),dense-rank(),NTILE()接下来详细说明其使用
1.row-number
作用:排序,实现分页
例如:
1 SELECT * 2 FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY FDate DESC ) AS R , 3 * 4 FROM dbo.FI_ProfitAndLoss 5 ) AS A 6 WHERE R BETWEEN 1 AND 100;
结果如下:
注意:1、要使用over()子句选择对某一列进行排序才能生成序号,并实现排序。
2、over()子句中的order by 字段 要与sql排序记录中的order by 字段保持一致, 否则得到的序号可能不是连续的(序号不连续,比较乱)。
2.rank()
作用:用于返回结果集的分区内每行的排名
例如:
1 SELECT RANK() OVER ( ORDER BY FDate DESC ) AS R , 2 FDate 3 FROM dbo.FI_ProfitAndLoss;
结果如下:
图中前十条记录的FDate相同,所以他们的序号是一样的,第11条记录的序号就是11,
注意:如果第一名和第二名的数据相同,则并列为第一名,接下来为第三名,为分组不连续排名。
3、dense-rank()
作用:与rank()基本一样,但生成的分组排名序号是连续的。
例如:
1 SELECT DENSE_RANK() OVER ( ORDER BY FDate DESC ) AS R , 2 FDate 3 FROM dbo.FI_ProfitAndLoss;
结果如下
图中前十条记录的FDate相同,所以他们的序号是一样的,第11条记录的序号紧接上一个的序号,所以为2不为3,后面的依此类推
4、NTILE()
作用:ntile函数可以对序号进行分组处理,将有序分区中的行分发到指定数目的组中。 各个组有编号,编号从一开始。 对于每一个行,ntile 将返回此行所属的组的编号。这就相当于将查询出来的记录集放到指定长度的数组中,每一个数组元素存放一定数量的记录。ntile函数为每条记录生成的序号就是这条记录所有的数组元素的索引(从1开始)。也可以将每一个分配记录的数组元素称为“桶”。ntile函数有一个参数,用来指定桶数。下面的SQL语句使用ntile函数对FI_ProfitAndLoss表进行了装桶处理:
例如:
1 SELECT NTILE(6) OVER ( ORDER BY FDate DESC ) AS R , 2 FDate 3 FROM dbo.FI_ProfitAndLoss WHERE companyid='264';
结果如下:
如图,一共19条数据,分6组,第一组4条数据,其他五组都是3条数据 。
1、每组的记录数不能大于它上一组的记录数,即编号小的桶放的记录数不能小于编号大的桶。也就是说,第1组中的记录数只能大于等于第2组及以后各组中的记录数。
2、所有组中的记录数要么都相同,要么从某一个记录较少的组(命名为X)开始后面所有组的记录数都与该组(X组)的记录数相同。也就是说,如果有个组,前三组的记录数都是9,而第四组的记录数是8,那么第五组和第六组的记录数也必须是8。
总结:
在使用排名函数的时候需要注意以下三点:
1、排名函数必须有 OVER 子句。
2、排名函数必须有包含 ORDER BY 的 OVER 子句。
3、分组内从1开始排序。