排名函数三兄弟,一看名字就知道,都是为了排名而生!但是各自有各自的特色!以下一个例子说明问题!(以下栗子没有使用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. 理解Ruby中的作用域

    作用域对于Ruby以及其它编程语言都是一个需要理解的至关重要的基础知识.在我刚开始学习ruby的时候遇到很多诸如变量未定义.变量没有正确赋值之类的问题,归根结底是因为自己对于ruby作用域的了解不够, ...

  2. maven url

    aliyun阿里云Maven仓库地址--加速你的maven构建   maven仓库用过的人都知道,国内有多么的悲催.还好有比较好用的镜像可以使用,尽快记录下来.速度提升100倍. http://mav ...

  3. lodash常用方法1--查询

    1.find var _ = require('lodash'); var user1 = { name: 'zhangsan', height: 180, weight: 120 }; var us ...

  4. jQuery超酷下拉插件6种效果演示

    原始的下拉框很丑啦, 给大家一款jQuery超酷下拉插件6种效果 效果预览 下载地址 实例代码 <div class="container"> <section ...

  5. 异常之JSP页面跳转出错

    今天在开发过程中发现一个问题:在页面中使用了<jsp:forward>抛错Attempt to clear a buffer that's already been flushed!! 百 ...

  6. 性能更好的js动画实现方式——requestAnimationFrame

    用js来实现动画,我们一般是借助setTimeout或setInterval这两个函数,css3动画出来后,我们又可以使用css3来实现动画了,而且性能和流畅度也得到了很大的提升.但是css3动画还是 ...

  7. 腾讯用过的插件jQuery twentytwenty 效果对比

    在线实例 左右对比 上下对比 使用方法 <div class="twentytwenty-container">     <img src="/api/ ...

  8. 基于Eclipse搭建STM32开源开发环境

    最近项目不忙,想着没事看看简单的嵌入式,弄弄物联网什么的.于是就从廉价的STM32开刀了.因为一直是做PC软件开发的,那VS的智能感知那叫一个爽啊,相比之下,觉得这个Keil简直就像文本编辑器一样lo ...

  9. iOS UISlider的使用

    UISlider是一个方便的控件,让用户能够以可视化的方式设置指定范围内的值. 和按钮一样,滑块也能响应事件,还可像文本框一样被读取.如果希望用户对滑块的调整立刻影响应用程序,则需要让他触发操作. 下 ...

  10. Ridge Regression(岭回归)

    Ridge Regression岭回归 数值计算方法的"稳定性"是指在计算过程中舍入误差是可以控制的. 对于有些矩阵,矩阵中某个元素的一个很小的变动,会引起最后计算结果误差很大,这 ...