原文: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. 防御暴力破解SSH攻击

    托管在IDC的机器我们通常都用SSH方式来远程管理.但是经常可以发现log-watch的日志中有大量试探登录的 信息,为了我们的主机安全,有必要想个方法来阻挡这些可恨的"HACKER&quo ...

  2. Redis Sorted Set

    Redis Sorted Set Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.redis正是通过分数来为集合 ...

  3. 如何从List中删除元素

    从List中删除元素,不能通过索引的方式遍历后删除,只能使用迭代器. 错误的实现 错误的实现方法 public class Demo {     public static void main(Str ...

  4. POJ 3461Oulipo KMP模板

    KMP之所以线性,因为匹配的时候i是不往回走的 我们只用调整j的位置 假设在s中找t 用二元组(i,j)表示s串的[i-j+1,i] 与t串的[1,j]匹配 假设s[i+1]和t[j]匹配上了,就j+ ...

  5. PHP:在class中定义常量注意事项

    一.不能在成员函数中定义常量,否则会引发诡异地语法错误 syntax error, unexpected 'CONST' (T_CONST) 示例 /* 错误的方式 */ class A { publ ...

  6. 洛谷 P2312 解方程 解题报告

    P2312 解方程 题目描述 已知多项式方程: \(a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\)求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) 均为正整 ...

  7. Linux装软件

    一.rpm包安装方式步骤: 1.找到相应的软件包,比如soft.version.rpm,下载到本机某个目录: 2.打开一个终端,su -成root用户: 3.cd soft.version.rpm所在 ...

  8. ZOJ 3822 Domination (三维概率DP)

    E - Domination Time Limit:8000MS     Memory Limit:131072KB     64bit IO Format:%lld & %llu Submi ...

  9. 2015年4月1日 14:36:56 EF 主从表更新

    公司封装框架的人把eF封在了工作单元里面,使用了Unitofwork这样的形式, 我用代码生成器生成了基础的单表操作的代码. 这种方式对多表有问题. 暂时只得,一张表一张表地操作, 我采用先用List ...

  10. 简单粗暴!解决锐捷强制关闭VMware NAT Service的问题(图文教程)

    众所周知毒瘤的锐捷会定时强制关闭NAT服务,导致虚拟机连不上网,进而你的虚拟机就成了孤儿,只能玩单机. 在一番百度后,得到了一种神仙破解办法.原理是把锐捷关闭服务时所用的搜索关键字改掉,这样锐捷就搜不 ...