排名函数三兄弟,一看名字就知道,都是为了排名而生!但是各自有各自的特色!以下一个例子说明问题!(以下栗子没有使用Partition By 的关键字,整个结果集进行排序)

RANK 每个值一个排名,同样的值排同样的位置,如第一名有2个,下一个值就要排第三,如此类推,表现如下面的 RandNr 列
DENSE_RANK 每个值一个排名,跟Rank 不一致的地方在于它不跳号,会1,2,3 那样排下来
ROW_NUMBER 每行一个排序值,遇到相同的排序条件的时候,按照顺序给值,对应表现如下面RowNr 列
;WITH CTE1(ID,Col1) AS
(
SELECT 1 ,'AA'
UNION ALL
SELECT 1 ,'AA'
UNION ALL
SELECT 2 ,'BB'
UNION ALL
SELECT 3 ,'CC'
UNION ALL
SELECT 3 ,'CC'
UNION ALL
SELECT 4 ,'DD'
UNION ALL
SELECT 5 ,'EE'
)
SELECT RANK() OVER (ORDER BY ID) AS RankNr,
DENSE_RANK() OVER (ORDER BY ID) AS DenseNr,
ROW_NUMBER() OVER (ORDER BY ID) AS RowNr,
*
FROM CTE1 RankNr DenseNr RowNr ID Col1
-------------------- -------------------- -------------------- ----------- ----
1 1 1 1 AA
1 1 2 1 AA
3 2 3 2 BB
4 3 4 3 CC
4 3 5 3 CC
6 4 6 4 DD
7 5 7 5 EE

然后其实说起排名函数,over 子句的作用也是相当关键的。

Over 子句后面的内容基本如下

Over(

Partition By AAA,BBB --表示按照AAA,BBB进行分组,每个分组从1开始计数,如果忽略 Partition By 关键字,就当整个结果集作为一个分组来排序

Order by CCC asc,DDD desc --表示按照ccc,ddd 的执行排序赋予排序值,如果没有特定的排序顺序怎么办呢? 可以使用  (select 1) 或者用 newid() 这个就用于随机排序用的

)

三兄弟讲完了~扯一下其它方面的

然而Over 子句还有一个更有用的用法,当使用窗口聚合函数(不是排序函数了) 的时候。Over 子句除了可以指定分组之外(这个貌似是2012之后的版本才支持,2012之前的版本只支持结果集的全部聚合),

比方说我还是拿回之前生成了500行数据的测试表(数据没有贴完整了),有时候做对比和统计还是相当有用的哟~~~

SELECT ID,
SUM(ID) OVER (ORDER BY (SELECT 1) ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Nr1, --从首行累加到当前行
SUM(ID) OVER (ORDER BY (SELECT 1) ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS Nr2, --前一行和当前行求和
SUM(ID) OVER (ORDER BY (SELECT 1) ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING ) AS Nr3 --后一行和当前行求和
FROM dbo.Tmp123 ID Nr1 Nr2 Nr3
----------- ----------- ----------- -----------
1 1 1 3
2 3 3 5
3 6 5 7
4 10 7 9
5 15 9 11
6 21 11 13
7 28 13 15
8 36 15 17
9 45 17 19
10 55 19 21
11 66 21 23
12 78 23 25
13 91 25 27
14 105 27 29

好用的排名函数~ROW_NUMBER(),RANK(),DENSE_RANK() 三兄弟的更多相关文章

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

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

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

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

  3. Spark2 Dataset分析函数--排名函数row_number,rank,dense_rank,percent_rank

    select gender,       age,       row_number() over(partition by gender order by age) as rowNumber,    ...

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

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

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

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

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

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

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

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

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

  9. 排名函数row_number() over(order by)用法

    1. 定义 简单的说row_number()从1开始,为每一条分组记录返回一个数字,这里的ROW_NUMBER() OVER (ORDER BY [列名]DESC) 是先把[列名]降序排列,再为降序以 ...

随机推荐

  1. 修复 XE7 , XE8 Frame 内 PopupMenu 快捷键失效问题

    问题:将 Frame 含 PopupMenu 放置 Form 后,在 Frame 里的 PopupMenu 失效,无法按快捷键. 适用:(XE7 update 1 / XE8) for Windows ...

  2. 代码与图详解性能之Python集合类型(list tuple dict set generator)

    Python内嵌的集合类型有list.tuple.set.dict. 列表list:看似数组,但比数组强大,支持索引.切片.查找.增加等功能. 元组tuple:功能跟list差不多,但一旦生成,长度及 ...

  3. python-ldap实现登录案例

    ldap_config = { 'ldap_path': 'ldap://xx.xx.xx.xx:389', 'base_dn': 'ou=users,dc=ledo,dc=com', 'ldap_u ...

  4. BaseActivity的抽取

    Activity有些公共部分,比如setContentView.Activity管理.初始化操作.联网操作.Activity跳转.关闭当前Activity.保存用户登录信息.读取用户登录信息等. 我们 ...

  5. Java一步一步构建web系统 在IDEA下用Maven搭建多模块项目

    1.需求 做一个项目会有很多模块,主要是方便复用,通过各个模块之间聚合.模块也可以独立出来,如公用类库,也可以在做其它项目中使用.该文的实例会有两个模块:分别为dallin-web模块,dallin- ...

  6. spring amqp rabbitmq fanout配置

    基于spring amqp rabbitmq fanout配置如下: 发布端 <rabbit:connection-factory id="rabbitConnectionFactor ...

  7. Scroll Depth – 衡量页面滚动的 Google 分析插件

    Scroll Depth 是一个小型的 Google Analytics(谷歌分析)插件,可以让你衡量用户在页面上滚动了多远.它可以监控 25%.50%.75% 和 100% 四个滚动点,并发送谷歌分 ...

  8. [deviceone开发]-do_Socket组件示例

    一.简介 do_Socket只实现了socket的客户端的功能,这个示例完整了展示了组件的基本用法,需要和sockettest3工具配合使用,sockettest3做为一个socket server来 ...

  9. Python开发GIS的应用组件包

    Library name Description Reason to install   NumPy This adds support for large multidimensional arra ...

  10. linux集群运维工具:clustershell和pssh

    由于需要安装hadoop集群,有10台机器需要安装,一开始打算用SCP复制,后来觉得不可接受(实际现场可能数倍的机器集群,就是10台也不想干).后来在网上找了,发现了clustershell和pssh ...