zoukankan      html  css  js  c++  java
  • row_number,rank,dense_rank,ntile排名函数的用法

    这篇文章介绍SQL中4个很有意思的函数,我称它的行标函数,它们是row_number,rank,dense_rank和ntile,下面分别进行介绍。

    一  row_number:它为数据表加一个叫“行标示”的列,它在数据表中是连续的,我们必须按着某个顺序把表排序之后,才能使用row_number,看下列例子:

    SELECT   row_number() OVER ( ORDER BY SalePrice ) AS row ,
                        *
              FROM      Product

    结果表被加上了行号:

    这个row_number在平常用的最多,它可以用来实现数据表的分页功能,看下面代码

    复制代码
     SELECT *
     FROM   ( SELECT    row_number() OVER ( ORDER BY SalePrice ) AS row ,
                        *
              FROM      Product
            ) AS Result
     WHERE  Result.row BETWEEN 1 AND 2 
     
    复制代码

    它的含义是从第一条记录开始,取出2条记录,如果你想一页显示10条记录,可以使用BETWEEN 1 AND 10,如果想得到第二次的10条,那条件就变成BETWEEN 11 AND 20

    二   rank:类型于row_number,不同之处在于,它会对order by 的字段进行处理,如果这个字段值相同,那么,行号保持不变,如代码:

     SELECT RANK() OVER ( ORDER BY SalePrice ) AS row ,
            SalePrice ,
            ProductID ,
            ProductName
     FROM   Product

    结果如下:

    三   dense_rank:与rank类型,不同之处在于行号是否保留一个位置,rank对保留这个位置,即上面图中,row的值由1直接变为3,因为它 的1出现了两次,所以为2保留了一个位置,而dense_rank不会保留2这个位置,即实现的行号2其实是排在了第3位,如代码:

     SELECT DENSE_RANK() OVER ( ORDER BY SalePrice ) AS row ,
            SalePrice ,
            ProductID ,
            ProductName
     FROM   Product

    结果如下:

    四   ntile:为装桶操作,ntile(桶数)它在运行之前,先确定产生的桶数,然后根据桶数去生成行标,如代码:

     SELECT NTILE(1) OVER ( ORDER BY SalePrice ) AS ntile ,
            SalePrice ,
            ProductID ,
            ProductName
     FROM   Product

    结果如下:

    如果设为NTILE(3),那结果就为:

    当我们面对一个复杂的问题时,考验的不是你是否能解决,而是你采取哪种方式去解决以及代码的性能问题。

  • 相关阅读:
    SQList基础+ListView基本使用
    Git本地上传口令
    记住用户名和登录密码+虚拟机没有root权限解决办法
    API+gir上传错误解决办法
    界面跳转+信息传递+AS中如何将ADV转移到其他盘中
    界面跳转
    Android学习——ListView
    开课第一周周总结
    体温上报APP——班级统计
    体温上报APP——打印
  • 原文地址:https://www.cnblogs.com/AllUserBegin/p/4390088.html
Copyright © 2011-2022 走看看