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函数一样的高级排名 ...
随机推荐
- 在命令行中运行JUnit测试
可以在Eclipse之外运行JUnit测试,使用org.junit.runner.JUnitCore类. 这个类提供了runClasses()方法,它允许运行一个或多个测试类.runClasses() ...
- nodejs基础 -- 多进程
Node.js 多进程 我们都知道 Node.js 是以单线程的模式运行的,但它使用的是事件驱动来处理并发,这样有助于我们在多核 cpu 的系统上创建多个子进程,从而提高性能. 每个子进程总是带有三个 ...
- Miniconda 安装测试
背景: conda 是一个python的计算环境,minicoda 可以看做是conda的精简版 官网: https://conda.io/miniconda.html 安装: miniconda 支 ...
- Mac下配置Oracle数据库客户端远程连接数据库服务器
下载mac数据库客户端: 地址:http://www.oracle.com/technetwork/topics/intel-macsoft-096467.html 下载这俩个:(来源:http:// ...
- 在PC上运行安卓(Android)应用程序的4个方法
我有一部荣耀3C,一般放在宿舍(我随身携带的是一部诺基亚E63,小巧.稳定.待机时间长),在宿舍我就会用它在微信上看公众号里的文章,最近要考驾照也在上面用驾考宝典.最近想在实验室用这两个软件,但又懒得 ...
- MySQL死锁分析
死锁问题背景 做MySQL代码的深入分析也有些年头了,再加上自己10年左右的数据库内核研发经验,自认为对于MySQL/InnoDB的加锁实现了如指掌,正因如此,前段时间,还专门写了一篇洋洋洒洒的文章, ...
- 【DL】物体识别与定位
https://cloud.tencent.com/community/article/414833
- 想高效学会Hadoop,你要按照这个路线
学习hadoop,首先我们要知道hadoop是什么? 说到底Hadoop只是一项分布式系统的工具,我们在学习的时候要理解分布式系统设计中的原则以及方法,只有这样才能以不变应万变.再一个就是一定要动手, ...
- 本地文件到通过flume到hdfs
配置文件 cd /usr/app/flume1.6/conf vi flume-dirTohdfs.properties #agent1 name agent1.sources=source1 age ...
- Oracle 初始化参数 二三事,随记
(1) alter system set log_archive_dest_n='location=d:\一个存在的目录'; ---- 预期 但是如果“d:\一个存在的目录”不是一个有效的目录,则“ ...