sqlserver排名函数

Posted laoyang01

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlserver排名函数相关的知识,希望对你有一定的参考价值。

在做开发的时候,排名函数是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开始排序。

以上是关于sqlserver排名函数的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2008 中用户定义的排名/分析函数

SQL Server - 如何将 RANK 函数插入到已按排名顺序排序的行中?

C#黔驴技巧之实现统计结果排名

缺少 SQL SERVER 2014 代码片段

SQL Server - 我如何对上个月的产品进行排名?

排名函数