SQL 序号列ROW_NUMBER,RANK,DENSE_RANK、NTILE

简介: 原文:SQL 序号列ROW_NUMBER,RANK,DENSE_RANK、NTILE SQL 2005新增加相关函数 : ROW_NUMBER,RANK,DENSE_RANK、NTILE 窗口函数 ...
原文: SQL 序号列ROW_NUMBER,RANK,DENSE_RANK、NTILE

SQL 2005新增加相关函数 :
ROW_NUMBER,RANK,DENSE_RANK、NTILE
窗口函数

OVER ( 
       [ <PARTITION BY clause> ]  ----分区列
       [ <ORDER BY clause> ]   ---排序列
       [ <ROW or RANGE clause> ] ---SQL Server 2012 到 SQL Server 2014
       ) 

本文介绍窗口函数与以上四个函数的配合使用

---创建表初始化查询语句
CREATE TABLE YSH
(
  lev1 VARCHAR(10),
  lev2 VARCHAR(10),
  lvalue VARCHAR(10)
)
INSERT INTO YSH (lev1,lev2,lvalue) VALUES ('A','A1','lvalue1')
INSERT INTO YSH (lev1,lev2,lvalue) VALUES ('A','A1','lvalue2')
INSERT INTO YSH (lev1,lev2,lvalue) VALUES ('A','A1','')
INSERT INTO YSH (lev1,lev2,lvalue) VALUES ('A','A2','lvalue1')
INSERT INTO YSH (lev1,lev2,lvalue) VALUES ('A','A2','lvalue2')
INSERT INTO YSH (lev1,lev2,lvalue) VALUES ('B','B1','')
INSERT INTO YSH (lev1,lev2,lvalue) VALUES ('B','B2','lvalueB2')

1、ROW_NUMBER()
PARTITION BY 表示分区,有分区后不同的分区编号都会从1进行编号
ORDER BY 按列排序的方式

SELECT *,
ROW_NUMBER() OVER(ORDER BY lev1,lev2) Lev2NUM,
ROW_NUMBER() OVER(PARTITION BY lev1 ORDER BY lev1,lev2) Lev1NUM,
ROW_NUMBER() OVER(PARTITION BY lev1,lev2 ORDER BY lev1,lev2) Lev1NUM1
FROM YSH

以上查询执行结果无分区时编号依次增长;按lev1分区时,lev1值变更后编号从1开始重新编号;按lev1,lev2组合分区时,两列任何值变更均从新编号
注:此函数的窗口函数中必须存在order by 若不存在则报错。
这里写图片描述

2、RANK() 排名
PARTITION BY 表示分区,有分区后不同的分区编号都会从1进行编号
ORDER BY 按列排序的方式 若值相同则编号也相同。

SELECT *,
RANK() OVER(ORDER BY lev1)
FROM YSH

以上查询结果因为A 有5个相同的值按排名不分前后,但是B的排名在A后面则值为6
这里写图片描述

3、DENSE_RANK() 密集排名

SELECT *,
DENSE_RANK() OVER(ORDER BY lev1)
FROM YSH

以上执行查询结果是相同的排名相同,但是B的排名是紧接着A的编号继续增加的。
这里写图片描述

4、NTILE(int) 平均分组
NTILE(expr) OVER([PARTITION BY]ORDER BY) :把有序的数据集平均分配到 expr指定的数量的桶中,将桶号分配给每一行;如果不能平均分配,则较小桶号的桶分配额外的行,并且各个桶中能放的行数最多相差。

目录
相关文章
|
SQL 数据挖掘
|
SQL 存储 数据采集
sql中varchar转number时报错怎么解决
通过上述策略的综合运用,面对VARCHAR到NUMBER的转换挑战,不仅能够游刃有余地解决现有的问题,更能前瞻性地预防未来的隐患。在数字化转型的浪潮中,凭借其高性能、安全稳定的云产品与服务,为各类企业级应用保驾护航,助您轻松驾驭数据的海洋,实现业务的无缝扩展与全球布局。
793 0
|
关系型数据库 MySQL
【随手记】MySQL中ROW_NUMBER()、RANK()和DENSE_RANK()函数的用法
【随手记】MySQL中ROW_NUMBER()、RANK()和DENSE_RANK()函数的用法
1469 1
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之flink sql ROW_NUMBER()回退更新的机制,有相关文档介绍吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
409 1
【已解决】nested exception is java.sql.SQLSyntaxErrorException: ORA-01722: invalid number
【已解决】nested exception is java.sql.SQLSyntaxErrorException: ORA-01722: invalid number
378 0
|
SQL 关系型数据库 MySQL
Greenplum【SQL 02】ROW_NUMBER编号函数使用方法举例
Greenplum【SQL 02】ROW_NUMBER编号函数使用方法举例
435 0
|
SQL
SQL中rank(),dense_rank(),row_number()的异同
rank函数用于返回结果集的分区内每行的排名,行的排名是相关行之前的排名数加一。
1099 0
SQL中rank(),dense_rank(),row_number()的异同
rank()、dense-rank()、row-number()的区别
rank()、dense-rank()、row-number()的区别
1651 0
|
算法
Leetcode 313. Super Ugly Number
题目翻译成中文是『超级丑数』,啥叫丑数?丑数就是素因子只有2,3,5的数,7 14 21不是丑数,因为他们都有7这个素数。 这里的超级丑数只是对丑数的一个扩展,超级丑数的素因子不再仅限于2 3 5,而是由题目给定一个素数数组。与朴素丑数算法相比,只是将素因子变了而已,解法还是和朴素丑数一致的。
395 1
|
存储 SQL 算法
LeetCode 题目 65:有效数字(Valid Number)【python】
LeetCode 题目 65:有效数字(Valid Number)【python】