好用的排名函数~ROW_NUMBER(),RANK(),DENSE_RANK() 三兄弟
排名函数三兄弟,一看名字就知道,都是为了排名而生!但是各自有各自的特色!以下一个例子说明问题!(以下栗子没有使用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() 三兄弟的更多相关文章
- SQL Server中排名函数row_number,rank,dense_rank,ntile详解
SQL Server中排名函数row_number,rank,dense_rank,ntile详解 从SQL SERVER2005开始,SQL SERVER新增了四个排名函数,分别如下:1.row_n ...
- SQL Server:排名函数row_number,rank,dense_rank,ntile详解
1.Row_Number函数 row_number函数大家比较熟悉一些,因为它的用途非常的广泛,我们经常在分页与排序中用到它,它的功能就是在每一行中生成一个连续的不重复的序号 例如: select S ...
- Spark2 Dataset分析函数--排名函数row_number,rank,dense_rank,percent_rank
select gender, age, row_number() over(partition by gender order by age) as rowNumber, ...
- 知方可补不足~row_number,rank,dense_rank,ntile排名函数的用法
回到目录 这篇文章介绍SQL中4个很有意思的函数,我称它的行标函数,它们是row_number,rank,dense_rank和ntile,下面分别进行介绍. 一 row_number:它为数据表加一 ...
- 大数据学习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 ...
- Hive学习之路 (十四)Hive分析窗口函数(二) NTILE,ROW_NUMBER,RANK,DENSE_RANK
概述 本文中介绍前几个序列函数,NTILE,ROW_NUMBER,RANK,DENSE_RANK,下面会一一解释各自的用途. 注意: 序列函数不支持WINDOW子句.(ROWS BETWEEN) 数据 ...
- ROW_NUMBER()/RANK()/DENSE_RANK()/ntile() over()
ROW_NUMBER()/RANK()/DENSE_RANK()/ntile() over() 今天女票问我SqlServer的四种排序,当场写了几句Sql让她了解,现把相关Sql放上来. 首先, ...
- SQL Server - 四种排序, ROW_NUMBER() /RANK() /DENSE_RANK() /ntile() over()
>>>>英文版 (更简洁易懂)<<<< 转载自:https://dzone.com/articles/difference-between-rownum ...
- 排名函数row_number() over(order by)用法
1. 定义 简单的说row_number()从1开始,为每一条分组记录返回一个数字,这里的ROW_NUMBER() OVER (ORDER BY [列名]DESC) 是先把[列名]降序排列,再为降序以 ...
随机推荐
- 修复 XE7 , XE8 Frame 内 PopupMenu 快捷键失效问题
问题:将 Frame 含 PopupMenu 放置 Form 后,在 Frame 里的 PopupMenu 失效,无法按快捷键. 适用:(XE7 update 1 / XE8) for Windows ...
- 代码与图详解性能之Python集合类型(list tuple dict set generator)
Python内嵌的集合类型有list.tuple.set.dict. 列表list:看似数组,但比数组强大,支持索引.切片.查找.增加等功能. 元组tuple:功能跟list差不多,但一旦生成,长度及 ...
- python-ldap实现登录案例
ldap_config = { 'ldap_path': 'ldap://xx.xx.xx.xx:389', 'base_dn': 'ou=users,dc=ledo,dc=com', 'ldap_u ...
- BaseActivity的抽取
Activity有些公共部分,比如setContentView.Activity管理.初始化操作.联网操作.Activity跳转.关闭当前Activity.保存用户登录信息.读取用户登录信息等. 我们 ...
- Java一步一步构建web系统 在IDEA下用Maven搭建多模块项目
1.需求 做一个项目会有很多模块,主要是方便复用,通过各个模块之间聚合.模块也可以独立出来,如公用类库,也可以在做其它项目中使用.该文的实例会有两个模块:分别为dallin-web模块,dallin- ...
- spring amqp rabbitmq fanout配置
基于spring amqp rabbitmq fanout配置如下: 发布端 <rabbit:connection-factory id="rabbitConnectionFactor ...
- Scroll Depth – 衡量页面滚动的 Google 分析插件
Scroll Depth 是一个小型的 Google Analytics(谷歌分析)插件,可以让你衡量用户在页面上滚动了多远.它可以监控 25%.50%.75% 和 100% 四个滚动点,并发送谷歌分 ...
- [deviceone开发]-do_Socket组件示例
一.简介 do_Socket只实现了socket的客户端的功能,这个示例完整了展示了组件的基本用法,需要和sockettest3工具配合使用,sockettest3做为一个socket server来 ...
- Python开发GIS的应用组件包
Library name Description Reason to install NumPy This adds support for large multidimensional arra ...
- linux集群运维工具:clustershell和pssh
由于需要安装hadoop集群,有10台机器需要安装,一开始打算用SCP复制,后来觉得不可接受(实际现场可能数倍的机器集群,就是10台也不想干).后来在网上找了,发现了clustershell和pssh ...