SQL中ROW_NUMBER()/RANK() /DENSE_RANK() OVER函数的基本用法
一、ROW_NUMBER()的用法
语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)
row_number()从1开始,为每一条分组记录返回一个数字,这里的ROW_NUMBER() OVER (ORDER BY colum DESC) 是先把colum列降序,再为降序以后的每条colum记录返回一个序号。
示例:
Row_Num colum
1 2200
2 2150
3 1780
4 1125
Row_NUMBER() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的,没有重复值)
实例1:
初始化数据
- create table employer (employerid int ,deptid int ,salary decimal(8,1))
- insert into employer values(1,1,15000.0)
- insert into employer values(2,1,10000.0)
- insert into employer values(3,2,19000.0)
- insert into employer values(4,2,21000.0)
- insert into employer values(5,3,14500.0)
- insert into employer values(6,3,10000.0)
- insert into employer values(7,3,44500.0)
- insert into employer values(8,4,22500.0)
- insert into employer values(9,4,35500.0)
- insert into employer values(10,4,35500.0)
- insert into employer values(11,4,36000.0)
- insert into employer values(12,4,36000.0)
数据显示为
employerid deptid salary
----------- ----------- ---------------------------------------
1 1 15000.0
2 1 10000.0
3 2 19000.0
4 2 21000.0
5 3 14500.0
6 3 10000.0
7 3 44500.0
8 4 22500.0
9 4 35500.0
10 4 35500.0
11 4 36000.0
12 4 36000.0
需求:根据部门分组,显示每个部门的工资等级
预期结果:
employerid deptid salary Leve
----------- ----------- ---------------------------------------
1 1 15000.0 1
2 1 10000.0 2
4 2 21000.0 1
3 2 19000.0 2
7 3 44500.0 1
5 3 14500.0 2
6 3 10000.0 3
11 4 36000.0 1
12 4 36000.0 2
9 4 35500.0 3
10 4 35500.0 4
8 4 22500.0 5
SQL脚本:
SELECT *, ROW_NUMBER() OVER (PARTITION BY deptid ORDER BY salary desc) Leve FROM employeer
实例2:
初始化数据
- create table tb_EmployerSign (SignId int ,EmployerId int ,SignDate datetime)-- 创建员工签到表
- insert into tb_EmployerSign values(1,1,'2014-09-15 18:21:38.130' )
- insert into tb_EmployerSign values(2,2,'2014-09-16 18:21:38.130' )
- insert into tb_EmployerSign values(3,3,'2014-09-14 18:21:38.130' )
- insert into tb_EmployerSign values(4,4,'2014-09-16 18:21:38.130' )
- insert into tb_EmployerSign values(5,1,'2014-09-17 18:21:38.130' )
- insert into tb_EmployerSign values(6,2,'2014-09-17 19:21:38.130' )
- insert into tb_EmployerSign values(7,3,'2014-09-19 18:21:38.130' )
- insert into tb_EmployerSign values(8,4,'2014-09-20 18:21:38.130' )
数据显示为
SignId EmployerId SignDate
----------- ----------- -------------------------------------------
1 1 2014-09-15 18:21:38.130
2 2 2014-09-16 18:21:38.130
3 3 2014-09-14 18:21:38.130
4 4 2014-09-16 18:21:38.130
5 1 2014-09-17 18:21:38.130
6 2 2014-09-17 19:21:38.130
7 3 2014-09-19 18:21:38.130
8 4 2014-09-20 18:21:38.130
需求:查询三天内没有签到的员工最后一次签到的信息
假如今天是2014-09-21 则预期结果:
SignId EmployerId SignDate OutDateNumb
-------------------------------------------------------------------------------------------------------
5 1 2014-09-17 18:21:38.130 4
6 2 2014-09-17 19:21:38.130 4
SQL脚本:
- select SignId,EmployerId,SignDate,datediff(dd,SignDate,getdate()) as OutDateNumb
- from (select *,ROW_NUMBER() over(PARTITION by EmployerId order by signId DESC) numb from EmployerSign) tb
- where tb.numb=1 and datediff(dd,SignDate,getdate())>3<span style="font-size:14px;"><strong>
- </strong></span>
二、RANK()的用法
语法:RANK() OVER (PARTITION BY COL1 ORDER BY COL2)
RANK()的用法和ROW_NUMBER()类似,只不过RANK()是跳跃排序,有两个第三名时接下来就是第五名(同样是在各个分组内).
例如执行如下SQL语句之后实例1中的数据显示结果如下:
SELECT *, RANK() OVER (PARTITION BY deptid ORDER BY salary desc) Leve FROM employer
结果:
employerid deptid salary Leve
----------- ----------- ---------------------------------------
1 1 15000.0 1
2 1 10000.0 2
4 2 21000.0 1
3 2 19000.0 2
7 3 44500.0 1
5 3 14500.0 2
6 3 10000.0 3
11 4 36000.0 1
12 4 36000.0 1
9 4 35500.0 3
10 4 35500.0 3
8 4 22500.0 5
三、DENSE_RANK()的用法
语法:DENSE_RANK() OVER(PARTITION BY COL1 ORDER BY COL2)
DENSE_RANK()的用法和ROW_NUMBER()类似,只不过DENSE_RANK()是连续排序,有两个第二名时仍然跟着第三名(同样在各个分组内)。
例如执行如下SQL语句后实例1中的数据显示如下:
SELECT *, DENSE_RANK() OVER (PARTITION BY deptid ORDER BY salary desc) Leve FROM employee
结果:
employerid deptid salary Leve
----------- ----------- ---------------------------------------
1 1 15000.0 1
2 1 10000.0 2
4 2 21000.0 1
3 2 19000.0 2
7 3 44500.0 1
5 3 14500.0 2
6 3 10000.0 3
11 4 36000.0 1
12 4 36000.0 1
9 4 35500.0 2
10 4 35500.0 2
8 4 22500.0 3
SQL中ROW_NUMBER()/RANK() /DENSE_RANK() OVER函数的基本用法的更多相关文章
- sqlserver 中row_number,rank,dense_rank,ntile排名函数的用法
1.row_number() 就是行号 2.rank:类似于row_number,不同之处在于,它会对order by 的字段进行处理,如果这个字段值相同,那么,行号保持不变 3.dense_rank ...
- SQL Server中排名函数row_number,rank,dense_rank,ntile详解
SQL Server中排名函数row_number,rank,dense_rank,ntile详解 从SQL SERVER2005开始,SQL SERVER新增了四个排名函数,分别如下:1.row_n ...
- 大数据学习day29-----spark09-------1. 练习: 统计店铺按月份的销售额和累计到该月的总销售额(SQL, DSL,RDD) 2. 分组topN的实现(row_number(), rank(), dense_rank()方法的区别)3. spark自定义函数-UDF
1. 练习 数据: (1)需求1:统计有过连续3天以上销售的店铺有哪些,并且计算出连续三天以上的销售额 第一步:将每天的金额求和(同一天可能会有多个订单) SELECT sid,dt,SUM(mone ...
- 知方可补不足~row_number,rank,dense_rank,ntile排名函数的用法
回到目录 这篇文章介绍SQL中4个很有意思的函数,我称它的行标函数,它们是row_number,rank,dense_rank和ntile,下面分别进行介绍. 一 row_number:它为数据表加一 ...
- SQL Server - 四种排序, ROW_NUMBER() /RANK() /DENSE_RANK() /ntile() over()
>>>>英文版 (更简洁易懂)<<<< 转载自:https://dzone.com/articles/difference-between-rownum ...
- ROW_NUMBER()/RANK()/DENSE_RANK()/ntile() over()
ROW_NUMBER()/RANK()/DENSE_RANK()/ntile() over() 今天女票问我SqlServer的四种排序,当场写了几句Sql让她了解,现把相关Sql放上来. 首先, ...
- Hive学习之路 (十四)Hive分析窗口函数(二) NTILE,ROW_NUMBER,RANK,DENSE_RANK
概述 本文中介绍前几个序列函数,NTILE,ROW_NUMBER,RANK,DENSE_RANK,下面会一一解释各自的用途. 注意: 序列函数不支持WINDOW子句.(ROWS BETWEEN) 数据 ...
- 在MySQL中实现Rank高级排名函数【转】
MySQL中没有Rank排名函数,当我们需要查询排名时,只能使用MySQL数据库中的基本查询语句来查询普通排名.尽管如此,可不要小瞧基础而简单的查询语句,我们可以利用其来达到Rank函数一样的高级排名 ...
- 在MySQL中实现Rank高级排名函数
MySQL中没有Rank排名函数,当我们需要查询排名时,只能使用MySQL数据库中的基本查询语句来查询普通排名.尽管如此,可不要小瞧基础而简单的查询语句,我们可以利用其来达到Rank函数一样的高级排名 ...
随机推荐
- Linux命令_用户和用户组管理
新增组的命令 groupadd 格式:groupadd [-g GID] groupname 如果不加-g选项,则按照系统默认的gid创建组.跟uid一样,gid也是从1000开始的. 我们也可以如下 ...
- Java是一门面向对象编程语言的理解
Java是一门面向对象编程语言. 不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征. Java语言作为静态面向对象编程语言的 ...
- 嵌入式驱动开发只设备数---dts
http://blog.sina.com.cn/s/blog_ad64b8200101e7q0.html
- Wings 3D
Wings 3D 编辑 Wings 3D 是一个开源的三维计算机图形软件.使用翼边数据库.注重于多边形建模,构思取与 Izware 的 Nendo 和 Mirai.支持多种操作系统,包括 Linux. ...
- Java项目性能持续优化中……
尽量使用StringBuilder和StringBuffer进行字符串连接, 参考链接: Java编程中“为了性能”尽量要做到的一些地方
- 大爱HTML5 9款超炫HTML5最新动画源码
我们分享过很多漂亮的HTML5动画,包括CSS3菜单.HTML5 Canvas动画等.今天我们精选了9款非常不错的超炫HTML5最新动画及其源码,一起来看看. 1.HTML5可爱的404页面动画 很逗 ...
- eclipse中去掉validate的方法
昨天在右击项目想选择refresh的时候一不小心选择了validate,就发现target包出现了红色的叉号.当时觉得反正项目运行没有什么异常,就这么凑合了一天半多. 后来,当我改jsp的时候从< ...
- VIM技巧:选择文本块
在正常模式下(按ESC进入)按键v进入可视化模式,然后按键盘左右键或h,l键即可实现文本的选择.其它相关命令:v:按字符选择.经常使用的模式,所以亲自尝试一下它. V:按行选择.这在你想拷贝或者移动很 ...
- Java编程思想学习笔记——访问权限修饰词
几种访问权限修饰词 public,protected,private,friendly(Java中并无该修饰词,即包访问权限,不提供任何访问修饰词) 使用时,放置在类中成员(域或方法)的定义之前的,仅 ...
- eclipse 运行springboot项目
一:当在eclipse启动spring boot项目时出现问题: 错误: 找不到或无法加载主类 com.example.demo.DemoApplication 解决办法: 1,通过cmd命令行,进入 ...