今天图老师小编给大家介绍下SQLSERVER 2005的ROW_NUMBER、RANK、DENSE_RANK的用法,平时喜欢SQLSERVER 2005的ROW_NUMBER、RANK、DENSE_RANK的用法的朋友赶紧收藏起来吧!记得点赞哦~
【 tulaoshi.com - 编程语言 】
ROW_NUMBER()
--接上.
-------------------------------------------------------------------------------------
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 Race1 408 57
1 Adjustable Race6 324 52
1 Adjustable Race50 353 82
879 All-Purpose Bike Stand 7 144 34
712 AWC Logo Cap 7 288 38
3 BB Ball Bearing50 324 74
3 BB Ball Bearing6 443 81
3 BB Ball Bearing1 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
----------- ----------- -------------------- -------------------- --------------------
3000110 1 1 1
1000110 2 1 1
1000610 3 1 1
4000510 4 1 1
3000315 5 5 2
3000420 6 6 3
2000220 7 6 3
2000120 8 6 3
1000530 9 9 4
3000730 10 9 4
3000730 11 9 4
4000140 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
----------- ----------- -------------------- -------------------- --------------------
1000110 1 1 1
1000610 2 2 2
3000110 3 3 3
4000510 4 4 4
3000315 5 5 5
2000120 6 6 6
2000220 7 7 7
3000420 8 8 8
1000530 9 9 9
3000730 10 10 10
3000730 11 10 10
4000140 12 12 11
(12 行受影响)
*/
来源:http://www.tulaoshi.com/n/20160219/1594381.html
看过《SQLSERVER 2005的ROW_NUMBER、RANK、DENSE_RANK的用法》的人还看了以下文章 更多>>