• 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开始排序。

  • 相关阅读:
    Rocky Linux宣布 Rocky Linux 8.6 系统发布了
    微软在 Linux 操作系统中发现了两个漏洞
    Linux 命令行小技巧 – !叹号的用处
    如何在 Linux 系统中配置 firewalld 防火墙策略
    如何在 Ubuntu 中禁用 motd 欢迎消息
    在 CentOS 8 中删除旧的 Linux 系统内核
    i7z命令工具 – 用来查看CPU状况
    Redis问题收集
    Mysql问题收集
    12物联网开发终端管理篇java使用Druid连接池获取MySQL数据库数据,并通过MQTT发送(Windows系统)
  • 原文地址:https://www.cnblogs.com/MirZhai/p/9997410.html
Copyright © 2020-2023  润新知