原文: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 序号列ROW_NUMBER,RANK,DENSE_RANK、NTILE的更多相关文章

  1. PCB MS SQL 排序应用(row_number rank dense_rank NTILE PARTITION)

    一.排序前,准备数据 --表变量 ),流程数 int) insert into @table union all union all union all union all --查看一下 select ...

  2. SQL Server中排名函数row_number,rank,dense_rank,ntile详解

    SQL Server中排名函数row_number,rank,dense_rank,ntile详解 从SQL SERVER2005开始,SQL SERVER新增了四个排名函数,分别如下:1.row_n ...

  3. ROW_NUMBER()/RANK()/DENSE_RANK()/ntile() over()

    ROW_NUMBER()/RANK()/DENSE_RANK()/ntile() over()   今天女票问我SqlServer的四种排序,当场写了几句Sql让她了解,现把相关Sql放上来. 首先, ...

  4. SQL Server - 四种排序, ROW_NUMBER() /RANK() /DENSE_RANK() /ntile() over()

    >>>>英文版 (更简洁易懂)<<<< 转载自:https://dzone.com/articles/difference-between-rownum ...

  5. 知方可补不足~row_number,rank,dense_rank,ntile排名函数的用法

    回到目录 这篇文章介绍SQL中4个很有意思的函数,我称它的行标函数,它们是row_number,rank,dense_rank和ntile,下面分别进行介绍. 一 row_number:它为数据表加一 ...

  6. SQL-OVER与四种排名函数:ROW_NUMBER(),RANK(),DENSE_RANK(),NTILE()

    1 SELECT orderid,custid,val, ROW_NUMBER() OVER(ORDER BY val) AS rownum, RANK() OVER(ORDER BY val) AS ...

  7. SQL Server:排名函数row_number,rank,dense_rank,ntile详解

    1.Row_Number函数 row_number函数大家比较熟悉一些,因为它的用途非常的广泛,我们经常在分页与排序中用到它,它的功能就是在每一行中生成一个连续的不重复的序号 例如: select S ...

  8. SqlServer四种排序:ROW_NUMBER()/RANK()/DENSE_RANK()/ntile() over()

    首先,我们创建一些测试数据. if OBJECT_ID('Tempdb.dbo.#Tmp') is not null drop table #Tmp create table #Tmp ( name ...

  9. sqlserver 中row_number,rank,dense_rank,ntile排名函数的用法

    1.row_number() 就是行号 2.rank:类似于row_number,不同之处在于,它会对order by 的字段进行处理,如果这个字段值相同,那么,行号保持不变 3.dense_rank ...

随机推荐

  1. 聊聊、Spring WebApplicationInitializer

    说到 WebApplicationInitializer,这个接口是为了实现代码配置 Web 功能.只要实现了这个接口,那么就可以实现 Filter,Servlet,Listener 等配置,跟在 x ...

  2. Python——数据类型之list、tuple

    本篇主要内容 •  list初识 •  list元素的访问 •  list内部所有的方法 •  tuple介绍和与list用法的比较 我觉得Python里面用的最多的就是List了,感觉好强大.他能存 ...

  3. JDK从1.8升级到9.0.1后sun.misc.BASE64Decoder和sun.misc.BASE64Encoder不可用

    目录 描述 原因分析 处理办法 参考 描述 最近研究把项目的JDK升级从1.8升级到9.0.1,在eclipse上配置好JDK为9后,发现项目有错,查看发现sun.misc.BASE64Decoder ...

  4. StringBuilder_学习笔记

    参考:https://www.jianshu.com/p/160c9be0b132 连接符号 "+" 本质 字符串变量(非final修饰)通过 "+" 进行拼接 ...

  5. 【bzoj3866】The Romantic Hero dp

    题目描述 给你n个数,从中选出两个不相交非空集合S和T,使得S中的每一个元素都在T集合的前面,并且S集合中的所有数的亦或等于T集合中的所有数的与,求方案数 mod 10^9+7. 输入 The fir ...

  6. HTML5 localStorage与document.domain设置问题

    localStorage的写入和读取,不能跨子域,否则在一些移动端浏览器上,会出现读取不到的情况. 最近开发一个移动端的播放记录功能,在pc端和android版的chrome测试很顺利通过了,但后来进 ...

  7. [bzoj] 1878 HH的项链 || 莫队

    原题 给定长为 n 的一个序列,接下来 m 次询问,每次询问区间 [ l , r ] 内有多少个不同的数. 莫队: 离线\(O(n\log(n))\). 将序列分块. 以左端点所在块为第一关键字,右端 ...

  8. [poj] 1269 [zoj] 1280 Interesting Lines || 求两直线交点

    POJ原题 ZOJ原题 多组数据.每次给出四个点,前两个点确定一条直线,后两个点确定一条直线,若平行则输出"NONE",重合输出"LINE",相交输出" ...

  9. 回文后缀(suffix)

    回文后缀(suffix) 题目描述 给定字符集大小 SS ,问有多少个长度为 NN 的字符串不存在长度 >1>1 的回文后缀. 答案对 MM 取模. 输入格式 第一行两个正整数 n, kn ...

  10. java算法(一) 直接选择排序

    一.基本概念 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置(注:要把最大最小的元素和起始的元素交换), 然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾.以 ...