一、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:

初始化数据

  1.  
    create table employer (employerid int ,deptid int ,salary decimal(8,1))
  2.  
     
  3.  
    insert into employer values(1,1,15000.0)
  4.  
     
  5.  
    insert into employer values(2,1,10000.0)
  6.  
     
  7.  
    insert into employer values(3,2,19000.0)
  8.  
     
  9.  
    insert into employer values(4,2,21000.0)
  10.  
     
  11.  
    insert into employer values(5,3,14500.0)
  12.  
     
  13.  
    insert into employer values(6,3,10000.0)
  14.  
     
  15.  
    insert into employer values(7,3,44500.0)
  16.  
     
  17.  
    insert into employer values(8,4,22500.0)
  18.  
     
  19.  
    insert into employer values(9,4,35500.0)
  20.  
     
  21.  
    insert into employer values(10,4,35500.0)
  22.  
     
  23.  
    insert into employer values(11,4,36000.0)
  24.  
     
  25.  
    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:

初始化数据

  1.  
    create table tb_EmployerSign (SignId int ,EmployerId int ,SignDate datetime)-- 创建员工签到表
  2.  
     
  3.  
    insert into tb_EmployerSign values(1,1,'2014-09-15 18:21:38.130' )
  4.  
     
  5.  
    insert into tb_EmployerSign values(2,2,'2014-09-16 18:21:38.130' )
  6.  
     
  7.  
    insert into tb_EmployerSign values(3,3,'2014-09-14 18:21:38.130' )
  8.  
     
  9.  
    insert into tb_EmployerSign values(4,4,'2014-09-16 18:21:38.130' )
  10.  
     
  11.  
    insert into tb_EmployerSign values(5,1,'2014-09-17 18:21:38.130' )
  12.  
     
  13.  
    insert into tb_EmployerSign values(6,2,'2014-09-17 19:21:38.130' )
  14.  
     
  15.  
    insert into tb_EmployerSign values(7,3,'2014-09-19 18:21:38.130' )
  16.  
     
  17.  
    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脚本:

  1.  
    select SignId,EmployerId,SignDate,datediff(dd,SignDate,getdate()) as OutDateNumb
  2.  
     
  3.  
    from (select *,ROW_NUMBER() over(PARTITION by EmployerId order by signId DESC) numb from EmployerSign) tb
  4.  
     
  5.  
    where tb.numb=1 and datediff(dd,SignDate,getdate())>3<span style="font-size:14px;"><strong>
  6.  
    </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函数的基本用法的更多相关文章

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

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

  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. 大数据学习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 ...

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

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

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

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

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

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

  7. Hive学习之路 (十四)Hive分析窗口函数(二) NTILE,ROW_NUMBER,RANK,DENSE_RANK

    概述 本文中介绍前几个序列函数,NTILE,ROW_NUMBER,RANK,DENSE_RANK,下面会一一解释各自的用途. 注意: 序列函数不支持WINDOW子句.(ROWS BETWEEN) 数据 ...

  8. 在MySQL中实现Rank高级排名函数【转】

    MySQL中没有Rank排名函数,当我们需要查询排名时,只能使用MySQL数据库中的基本查询语句来查询普通排名.尽管如此,可不要小瞧基础而简单的查询语句,我们可以利用其来达到Rank函数一样的高级排名 ...

  9. 在MySQL中实现Rank高级排名函数

    MySQL中没有Rank排名函数,当我们需要查询排名时,只能使用MySQL数据库中的基本查询语句来查询普通排名.尽管如此,可不要小瞧基础而简单的查询语句,我们可以利用其来达到Rank函数一样的高级排名 ...

随机推荐

  1. 解决git pull 每一次都需要输入密码的问题

    方法1: 当我们配置好我们的git以后呢,我们可以在配置文件~/.gitconfig 或 ~/.config/git/config 文件里加入这么两行: [credential] helper = s ...

  2. VIM的自动补全

    自动补全可以很好的提高输入的效率: 触发自动补全的方法总结: 可供弹出式菜单的使用的命令: 其它再补充:

  3. 嵌入式驱动开发之内核态spi ---module_spi_driver

    http://blog.csdn.net/dearsq/article/details/51839083 http://blog.csdn.net/alleincao/article/details/ ...

  4. utf8_unicode_ci与utf8_general_ci的区别

    From: http://www.chinaz.com/program/2010/0225/107151.shtml 当前,utf8_unicode_ci校对规则仅部分支持Unicode校对规则算法. ...

  5. linux命令中的head命令

    head命令和tail命令就像他的名字一样浅显易懂,它是用来显示开头或者结尾某个数量的文字区块,head用来显示档案的开头至标准输出当中,而tail想当然就是查看档案的结尾. 命令格式 head  [ ...

  6. Gridview各种功能+AspNetPager+Ajax实现无刷新存储过程分页 (留着用)

    存储过程: GetProductsCount1: GetProductsByPage: ) * @PageSize) +' id from test)' exec sp_executesql @sql ...

  7. Thinkphp5笔记四:设置模板路径

    默认的模板路径在模块/view文件里面.如果你觉得这样不太方便管理,想要把他设置Template目录下,可以这样做. 模板参数 ,能够影响的它参数,是当前模块下config.php template- ...

  8. 【百度地图API】制作多途经点的线路导航——路线坐标规划

    一.创建地图 首先要告诉大家的是,API1.2版本取消密钥,取消服务设置,大家可以采用更加简短的方式引用API的JS啦~ <script type="text/javascript&q ...

  9. AdoConnect-获取连接字符串 (工具)

    使用ADO访问数据库时需要设置正确的连接字符串,为此特提供一个获取连接字符串的小工具,方便编程使用. 使用方法: 1.点击“连接字符串”,弹出数据链接属性对话框 2.可以使用“提供程序”新建数据源,也 ...

  10. 小企业是否能用得上"ITIL"?

    在小型IT部门中,明显存在着迫切的IT管理需求.但目前主流ITSM解决方案的价格.实施周期.复杂程度.对人力资源的占用等使他们难以承受.     浦发机械公司的计算机部经理老张带着十几个员工,经过数年 ...