知方可补不足~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),那结果就为:

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

本文转自博客园张占岭(仓储大叔)的博客,原文链接:知方可补不足~row_number,rank,dense_rank,ntile排名函数的用法,如需转载请自行联系原博主。

目录
相关文章
|
6月前
|
关系型数据库 MySQL
【随手记】MySQL中ROW_NUMBER()、RANK()和DENSE_RANK()函数的用法
【随手记】MySQL中ROW_NUMBER()、RANK()和DENSE_RANK()函数的用法
198 1
|
7月前
ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)
ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)
114 0
|
7月前
|
SQL 关系型数据库 MySQL
Greenplum【SQL 02】ROW_NUMBER编号函数使用方法举例
Greenplum【SQL 02】ROW_NUMBER编号函数使用方法举例
169 0
|
存储 JavaScript 前端开发
【JS交互埋坑】事件函数自动将数字字符串String转为数值Number
【JS交互埋坑】事件函数自动将数字字符串String转为数值Number
87 0
|
存储 JavaScript 前端开发
【JS交互埋坑】事件函数自动将数字字符串String转为数值Number
【JS交互埋坑】事件函数自动将数字字符串String转为数值Number
119 0
|
算法
Leetcode 313. Super Ugly Number
题目翻译成中文是『超级丑数』,啥叫丑数?丑数就是素因子只有2,3,5的数,7 14 21不是丑数,因为他们都有7这个素数。 这里的超级丑数只是对丑数的一个扩展,超级丑数的素因子不再仅限于2 3 5,而是由题目给定一个素数数组。与朴素丑数算法相比,只是将素因子变了而已,解法还是和朴素丑数一致的。
104 1
|
6月前
|
存储 SQL 算法
LeetCode 题目 65:有效数字(Valid Number)【python】
LeetCode 题目 65:有效数字(Valid Number)【python】
|
7月前
|
存储 算法
【LeetCode力扣】单调栈解决Next Greater Number(下一个更大值)问题
【LeetCode力扣】单调栈解决Next Greater Number(下一个更大值)问题
53 0
|
存储
Leetcode Single Number II (面试题推荐)
给你一个整数数组,每个元素出现了三次,但只有一个元素出现了一次,让你找出这个数,要求线性的时间复杂度,不使用额外空间。
42 0
|
算法
LeetCode 414. Third Maximum Number
给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。
97 0
LeetCode 414. Third Maximum Number