SQL Server 2005 引入几个新的排序(排名)函数,如ROW_NUMBER、RANK、DENSE_RANK等。
这些新函数使您可以有效地分析数据以及向查询的结果行提供排序值。

--------------------------------------------------------------------------
ROW_NUMBER()

说明:返回结果集分区内行的序列号,每个分区的第一行从 1 开始。
语法:ROW_NUMBER () OVER ( [ <partition_by_clause> ] <order_by_clause> ) 。
备注:ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。
参数:<partition_by_clause> :将 FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。
      <order_by_clause>:确定将 ROW_NUMBER 值分配给分区中的行的顺序。
返回类型:bigint 。

示例:
/*以下示例将根据年初至今的销售额,返回 AdventureWorks 中销售人员的 ROW_NUMBER。*/

USE AdventureWorks
GO
SELECT c.FirstName, c.LastName, ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS 'Row Number', s.SalesYTD, a.PostalCode
FROM Sales.SalesPerson s JOIN Person.Contact c on s.SalesPersonID = c.ContactID
JOIN Person.Address a ON a.AddressID = c.ContactID
WHERE TerritoryID IS NOT NULL AND SalesYTD <> 0
/*
FirstName  LastName    Row Number  SalesYTD      PostalCode
---------  ----------  ----------  ------------  ----------------------------
Shelley    Dyck        1           5200475.2313  98027
Gail       Erickson    2           5015682.3752  98055
Maciej     Dusza       3           4557045.0459  98027
Linda      Ecoffey     4           3857163.6332  98027
Mark       Erickson    5           3827950.238   98055
Terry      Eminhizer   6           3587378.4257  98055
Michael    Emanuel     7           3189356.2465  98055
Jauna      Elson       8           3018725.4858  98055
Carol      Elliott     9           2811012.7151  98027
Janeth     Esteves     10          2241204.0424  98055
Martha     Espinoza    11          1931620.1835  98055
Carla      Eldridge    12          1764938.9859  98027
Twanna     Evans       13          1758385.926   98055
(13 行受影响)
*/

/*以下示例将返回行号为 50 到 60(含)的行,并以 OrderDate 排序。*/
USE AdventureWorks;
GO
WITH OrderedOrders AS
(SELECT SalesOrderID, OrderDate,
ROW_NUMBER() OVER (order by OrderDate)as RowNumber
FROM Sales.SalesOrderHeader )
SELECT *
FROM OrderedOrders
WHERE RowNumber between 50 and 60;
/*
SalesOrderID OrderDate               RowNumber
------------ ----------------------- --------------------
43708        2001-07-03 00:00:00.000 50
43709        2001-07-03 00:00:00.000 51
43710        2001-07-03 00:00:00.000 52
43711        2001-07-04 00:00:00.000 53
43712        2001-07-04 00:00:00.000 54
43713        2001-07-05 00:00:00.000 55
43714        2001-07-05 00:00:00.000 56
43715        2001-07-05 00:00:00.000 57
43716        2001-07-05 00:00:00.000 58
43717        2001-07-05 00:00:00.000 59
43718        2001-07-06 00:00:00.000 60
(11 行受影响)
*/

--------------------------------------------------------------
RANK()

说明:返回结果集的分区内每行的排名。行的排名是相关行之前的排名数加一。
语法:RANK () OVER ( [ < partition_by_clause > ] < order_by_clause > )
备注:如果两个或多个行与一个排名关联,则每个关联行将得到相同的排名。
      例如,如果两位顶尖销售员具有同样的 SalesYTD 值,他们将并列第一。
      由于已有两行排名在前,所以具有下一个最大 SalesYTD 的销售人员将排名第三。
      因此,RANK 函数并不总返回连续整数。
      用于整个查询的排序顺序决定了行在结果集中的显示顺序。这也隐含了行在每个分区中的排名。
参数:< partition_by_clause > :将 FROM 子句生成的结果集划分为要应用 RANK 函数的分区。
      < order_by_clause >:确定将 RANK 值应用于分区中的行时所基于的顺序。
返回类型:bigint

示例:
/*以下示例按照数量对清单中的产品进行了排名。行集按 LocationID 分区,按 Quantity 排序。
USE AdventureWorks;
GO
SELECT i.ProductID, p.Name, i.LocationID, i.Quantity, RANK() OVER (PARTITION BY i.LocationID order by i.Quantity) as RANK
FROM Production.ProductInventory i JOIN Production.Product p
ON i.ProductID = p.ProductID
ORDER BY p.Name
GO
/*
ProductID   Name                                               LocationID Quantity RANK
----------- -------------------------------------------------- ---------- -------- --------------------
1           Adjustable Race                                    6          324      71
1           Adjustable Race                                    1          408      78
1           Adjustable Race                                    50         353      117
2           Bearing Ball                                       6          318      67
2           Bearing Ball                                       1          427      85
2           Bearing Ball                                       50         364      122
3           BB Ball Bearing                                    50         324      106
3           BB Ball Bearing                                    1          585      110
3           BB Ball Bearing                                    6          443      115
4           Headset Ball Bearings                              1          512      99
4           Headset Ball Bearings                              6          422      108
4           Headset Ball Bearings                              50         388      140
316         Blade                                              10         388      33
......
(1069 行受影响)
*/

--接上.
-------------------------------------------------------------------------------------
DENSE_RANK()

说明:返回结果集分区中行的排名,在排名中没有任何间断。行的排名等于所讨论行之前的所有排名数加一。
语法:DENSE_RANK () OVER ( [ < partition_by_clause > ] < order_by_clause > )
备注:如果有两个或多个行受同一个分区中排名的约束,则每个约束行将接收相同的排名。
      例如,如果两位顶尖销售员具有相同的 SalesYTD 值,则他们将并列第一。
      接下来 SalesYTD 最高的销售人员排名第二。该排名等于该行之前的所有行数加一。
      因此,DENSE_RANK 函数返回的数字没有间断,并且始终具有连续的排名。
      整个查询所用的排序顺序确定了各行在结果中的显示顺序。这说明排名第一的行可以不是分区中的第一行。
参数:< partition_by_clause > :将 FROM 子句所生成的结果集划分为数个将应用 DENSE_RANK 函数的分区。
      < order_by_clause >:确定将 DENSE_RANK 值应用于分区中各行的顺序。
返回类型:bigint

示例:
/*以下示例返回各位置上产品数量的 DENSE_RANK。 */
USE AdventureWorks;
GO
SELECT  i.ProductID, p.Name, i.LocationID, i.Quantity, DENSE_RANK() OVER (PARTITION BY i.LocationID order by i.Quantity) as DENSE_RANK
FROM Production.ProductInventory i JOIN Production.Product p ON i.ProductID = p.ProductID
ORDER BY Name;
GO
/*
ProductID   Name                                               LocationID Quantity DENSE_RANK
----------- -------------------------------------------------- ---------- -------- --------------------
1           Adjustable Race                                    1          408      57
1           Adjustable Race                                    6          324      52
1           Adjustable Race                                    50         353      82
879         All-Purpose Bike Stand                             7          144      34
712         AWC Logo Cap                                       7          288      38
3           BB Ball Bearing                                    50         324      74
3           BB Ball Bearing                                    6          443      81
3           BB Ball Bearing                                    1          585      82
*/

将上面三个函数放在一起计算,更能明显看出各个函数的功能。

CREATE TABLE rankorder(orderid INT,qty INT)
INSERT rankorder VALUES(30001,10)
INSERT rankorder VALUES(10001,10)
INSERT rankorder VALUES(10006,10)
INSERT rankorder VALUES(40005,10)
INSERT rankorder VALUES(30003,15)
INSERT rankorder VALUES(30004,20)
INSERT rankorder VALUES(20002,20)
INSERT rankorder VALUES(20001,20)
INSERT rankorder VALUES(10005,30)
INSERT rankorder VALUES(30007,30)
INSERT rankorder VALUES(40001,40)
INSERT rankorder VALUES(30007,30)
GO
--对一个列qty进行的排序
SELECT orderid,qty,
       ROW_NUMBER() OVER(ORDER BY qty) AS rownumber,
       RANK()       OVER(ORDER BY qty) AS rank,
       DENSE_RANK() OVER(ORDER BY qty) AS denserank
FROM rankorder
ORDER BY qty
/*
orderid     qty         rownumber            rank                 denserank
----------- ----------- -------------------- -------------------- --------------------
30001       10          1                    1                    1
10001       10          2                    1                    1
10006       10          3                    1                    1
40005       10          4                    1                    1
30003       15          5                    5                    2
30004       20          6                    6                    3
20002       20          7                    6                    3
20001       20          8                    6                    3
10005       30          9                    9                    4
30007       30          10                   9                    4
30007       30          11                   9                    4
40001       40          12                   12                   5
(12 行受影响)
*/

--对两个列qty,orderid进行的排序
SELECT orderid,qty,
       ROW_NUMBER() OVER(ORDER BY qty,orderid) AS rownumber,
       RANK()       OVER(ORDER BY qty,orderid) AS rank,
       DENSE_RANK() OVER(ORDER BY qty,orderid) AS denserank
FROM rankorder
ORDER BY qty,orderid
drop table rankorder
/*
orderid     qty         rownumber            rank                 denserank
----------- ----------- -------------------- -------------------- --------------------
10001       10          1                    1                    1
10006       10          2                    2                    2
30001       10          3                    3                    3
40005       10          4                    4                    4
30003       15          5                    5                    5
20001       20          6                    6                    6
20002       20          7                    7                    7
30004       20          8                    8                    8
10005       30          9                    9                    9
30007       30          10                   10                   10
30007       30          11                   10                   10
40001       40          12                   12                   11
(12 行受影响)
*/

--示例数据
CREATE TABLE tb(Name varchar(10),Score decimal(10,2))
INSERT tb SELECT 'aa',99
UNION ALL SELECT 'bb',56
UNION ALL SELECT 'cc',56
UNION ALL SELECT 'dd',77
UNION ALL SELECT 'ee',78
UNION ALL SELECT 'ff',76
UNION ALL SELECT 'gg',78
UNION ALL SELECT 'ff',50
GO

--1. 名次生成方式1,Score重复时合并名次
SELECT *,Place=(SELECT COUNT(DISTINCT Score) FROM tb WHERE Score>=a.Score)
FROM tb a
ORDER BY Place
/*--结果
Name       Score        Place
---------------- ----------------- -----------
aa         99.00        1
ee         78.00        2
gg         78.00        2
dd         77.00        3
ff         76.00        4
bb         56.00        5
cc         56.00        5
ff         50.00        6
--*/

--2. 名次生成方式2,Score重复时保留名次空缺
SELECT *,Place=(SELECT COUNT(Score) FROM tb WHERE Score>a.Score)+1
FROM tb a
ORDER BY Place
/*--结果
Name       Score        Place
--------------- ----------------- -----------
aa         99.00        1
ee         78.00        2
gg         78.00        2
dd         77.00        4
ff         76.00        5
bb         56.00        6
cc         56.00        6
ff         50.00        8
--*/
create table cj(bj int,zf int)
insert into cj select 1, 98
insert into cj select 2, 97
insert into cj select 1, 96
insert into cj select 2, 96
insert into cj select 1, 95
insert into cj select 2, 94
insert into cj select 1, 94
insert into cj select 2, 94
insert into cj select 1, 93

select bj,
     zmc=(select count(distinct zf) from cj where zf>a.zf)+1,
     bmc=(select count(distinct zf) from cj where zf>a.zf and bj=a.bj)+1,
     zf
from cj a

go
drop table cj

/*
bj          zmc         bmc         zf         
----------- ----------- ----------- -----------
1           1           1           98
2           2           1           97
1           3           2           96
2           3           2           96
1           4           3           95
2           5           3           94
1           5           4           94
2           5           3           94
1           6           5           93

(所影响的行数为 9 行)
*/

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/htl258/archive/2009/03/20/4006668.aspx

转载于:https://www.cnblogs.com/jizhitao/archive/2009/10/21/1587464.html

ROW_NUMBER、RANK、DENSE_RANK的用法(1)(转)相关推荐

  1. Hive分析窗口函数 NTILE,ROW_NUMBER,RANK,DENSE_RANK

    本文中介绍前几个序列函数,NTILE,ROW_NUMBER,RANK,DENSE_RANK,下面会一一解释各自的用途. Hive版本为 apache-hive-0.13.1 数据准备: cookie1 ...

  2. Hive ROW_NUMBER,RANK(),DENSE_RANK()

    准备数据 浙江,杭州,300 浙江,宁波,150 浙江,温州,200 浙江,嘉兴,100 江苏,南京,270 江苏,苏州,299 江苏,某市,200 江苏,某某市,100 创建表 CREATE tab ...

  3. SQL排序之 row_number, rank(), dense_rank()区别

    三者的区别如下: rank()排序相同时会重复,总数不变,即会出现1.1.3这样的排序结果: dense_rank()排序相同时会重复,总数会减少,即会出现1.1.2这样的排序结果: row_numb ...

  4. SQL中常用的窗口函数(排序函数)-row_number/rank/dense_rank/ntile

    总结四个函数的特点: row_number():连续不重复:1234567 rank() :重复不连续:1222567 dense_rank():重复且连续:1222345 ntile():平均分组: ...

  5. SQL新函数, 排名函数 - ROW_NUMBER(), RANK(), DENSE_RANK()

    ROW_NUMBER() 根据over后的order by字据的字段排序,返回一个不断递增的整数. use  Northwind go select  CompanyName, ContactName ...

  6. ROW_NUMBER、RANK、DENSE_RANK的用法

    --NND,索性把2005的一起帖出来. ROW_NUMBER.RANK.DENSE_RANK的用法 (爱新觉罗.毓华 2007-12-16 广东深圳)SQL Server 2005 引入几个新的排序 ...

  7. rank,dense_rank,row_number使用和区别

    rank,dense_rank,row_number区别 一:语法(用法):      rank() over([partition by col1] order by col2)       den ...

  8. 函数专题:sum、row_number、count、rank\dense_rank over

    来源:http://blog.csdn.net/bbliutao/article/details/7727320 一.sum over sum over主要用来对某个字段值进行逐步累加 SELECT  ...

  9. 常用sql001_partition by 以及 row_number()和 dense_rank()和rank()区别

    create table student (sid varchar2(10), --学号sname varchar2(10), --姓名classid varchar2(10), --班级号score ...

最新文章

  1. .NET Framework 4.0的新特性
  2. Mysql中设置默认时间为当前值
  3. C#线程学习的一点体会和总结
  4. 计算机的两个基本能力是存储程序,【2012年职称计算机模拟题(55)】- 环球网校...
  5. Eudemon 防火墙基本配置
  6. 禁止i5笔记本按Ctrl+Alt+向下键翻转屏幕
  7. axure中备注线_1分钟K线、日K线、月K线……不同周期的K线图到底有啥用?
  8. GitHub增加了代码审查、项目管理等新功能
  9. macOS Monterey 12.0 Beta5 (21A5304g) 虚拟机 ISO 镜像
  10. 虹科教您固定工业树莓派Modbus RTU设备编号
  11. 向量点乘(内积)和叉乘(外积、向量积)概念及几何意义解读
  12. 【FPGA】Vivado综合停滞、死机(PID Not Specified)解决方法
  13. allt什么意思_all是什么意思_all怎么读_all翻译_用法_发音_词组_同反义词_全部的-新东方在线英语词典...
  14. 实现外网Ping通WSL(网卡桥接方式实现)
  15. 阿里P5的测试开发工程师,都有哪些要求?
  16. 10_07【Java】Map集合详述
  17. 支付宝AR红包引出Python中的PIL小试
  18. Win10 清理备用内存
  19. uniapp打包apk文件申请高德地图key
  20. python【PyQt5】的环境搭建和使用(全网最全)其一

热门文章

  1. 欢迎来到yoeodeity yoeo耀月
  2. mysql物理删除索引_mysql创建索引,mysql索引优化,mysql索引创建删除
  3. 通信基础篇小项目-----简单网络画板的的实现
  4. 海量资源!开发人员成功转行数据科学必备清单
  5. 学会这些,不做委屈的项目经理
  6. 121. 买卖股票的最佳时机_面试题63. 股票的最大利润_[找出数组中一个元素和它后面最大的元素的差值]
  7. 单核CPU与多核CPU工作原理
  8. 使用keil5中的RL_TCPNet中间件建立一个工程
  9. 冯诺曼伊体系 计算机五大逻辑,科学网—再谈冯·诺伊曼结构 - 姜咏江的博文
  10. linux pppd源码下载_linux pppd脚本配置