亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > SQL Server > 正文

SQLSERVER 2005的ROW_NUMBER、RANK、DENSE_RANK的用法

2020-10-30 19:10:08
字體:
來源:轉載
供稿:網友
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 行受影響)
*/
SQL code

--接上.
--
-----------------------------------------------------------------------------------
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 行受影響)
*/
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲影院色在线观看免费| 欧美大片在线看免费观看| 日韩不卡中文字幕| 日韩高清免费在线| 国产亚洲精品美女久久久久| 色在人av网站天堂精品| 奇门遁甲1982国语版免费观看高清| 久久亚洲一区二区三区四区五区高| 不卡av在线网站| 色综合视频一区中文字幕| 成人欧美一区二区三区黑人| 日本精品视频在线观看| 91豆花精品一区| 亚洲一区二区久久久久久| 国产成人精品视| 久久久国产一区| 欧美一级淫片播放口| 国产精品午夜国产小视频| 精品一区二区三区电影| 欧美日韩亚洲精品一区二区三区| 亚洲乱亚洲乱妇无码| 亚洲第一精品电影| 久久久久久亚洲精品| 2018国产精品视频| 日韩免费中文字幕| 色婷婷久久av| 日韩成人激情影院| 日韩黄色av网站| 久久久精品免费视频| 国产精品一区久久| 欧洲亚洲免费在线| 亚洲国产精品电影在线观看| 亚洲欧美三级在线| 亚洲人成五月天| 91视频88av| 国产精品网站大全| 亚洲精品视频二区| 中文字幕在线看视频国产欧美在线看完整| 久久免费视频观看| 国产精品视频地址| 欧美激情亚洲综合一区| 久久久久亚洲精品成人网小说| 亚洲精品一区在线观看香蕉| 日韩精品视频在线观看网址| 国产九九精品视频| 国产精品福利片| 国产精品久久久久久久久免费看| 日韩精品有码在线观看| 一区二区三区四区精品| 成人黄色av网站| 欧美日韩成人精品| 91精品国产亚洲| 国产精品一区二区久久久久| 国产美女久久精品香蕉69| 色偷偷综合社区| 日本一欧美一欧美一亚洲视频| 精品久久久久久久久久久久久| 久久全国免费视频| 国产精品自产拍在线观看| 国产一区二区在线免费| 欧美日韩在线影院| 国产精品久久999| 久久人人爽亚洲精品天堂| 国产精品99久久久久久白浆小说| 国产亚洲精品久久| 欧美午夜宅男影院在线观看| 九九热99久久久国产盗摄| 清纯唯美日韩制服另类| 亚洲摸下面视频| 亚洲石原莉奈一区二区在线观看| 久久久精品一区二区三区| 亚洲白拍色综合图区| 538国产精品一区二区在线| 亚洲人午夜精品免费| 中文字幕亚洲图片| 国产欧美精品一区二区三区介绍| 日本成人精品在线| 欧美视频在线免费看| 日韩a**站在线观看| 国产精品免费看久久久香蕉| 日韩精品免费在线播放| 国产在线视频不卡| 日韩av在线免播放器| 精品日本美女福利在线观看| 亚洲女性裸体视频| 国产精品高潮呻吟视频| 不卡毛片在线看| 欧美日韩精品国产| 麻豆成人在线看| 国产精品成人久久久久| 中文字幕无线精品亚洲乱码一区| 日韩电视剧免费观看网站| 中文字幕日韩在线视频| 亚洲日韩第一页| 国产福利精品视频| 欧洲精品毛片网站| 国产裸体写真av一区二区| 亚洲在线免费观看| 亚洲精品suv精品一区二区| 国产亚洲视频在线观看| 中文字幕亚洲欧美日韩2019| 国产一区二区三区在线免费观看| 91精品啪aⅴ在线观看国产| 国产精品久久久久福利| 成人xxxx视频| 亚洲精品网址在线观看| 欧美精品videossex88| 国产精品一区二区三区在线播放| 亚洲男人天堂九九视频| 欧美电影电视剧在线观看| 亚洲免费高清视频| 97视频在线观看亚洲| 国产精品激情av电影在线观看| 日韩不卡中文字幕| 麻豆成人在线看| 精品成人国产在线观看男人呻吟| 国产精品美乳一区二区免费| 欧美高清在线观看| 亚洲级视频在线观看免费1级| 久久频这里精品99香蕉| 国产综合福利在线| 欧美亚洲国产视频小说| 国产精品www| 欧美高跟鞋交xxxxxhd| 国产亚洲xxx| 欧美另类极品videosbestfree| 亚洲成人av片在线观看| 国产日韩换脸av一区在线观看| 亚洲成人网在线| 国产一区二区三区直播精品电影| 亚洲第一中文字幕| 在线观看欧美www| 一区二区三区www| 亚洲xxxx做受欧美| 高潮白浆女日韩av免费看| 亚洲aa在线观看| 日韩欧美极品在线观看| 日本高清视频一区| 亚洲黄色在线看| 亚洲第一网站男人都懂| 日韩一区二区欧美| 久久人人爽人人爽人人片亚洲| 国产亚洲视频在线| 狠狠躁18三区二区一区| 日韩中文字幕在线视频播放| 欧美精品videosex牲欧美| 国产精品69久久| 欧美高清理论片| 5278欧美一区二区三区| 少妇久久久久久| 成人看片人aa| 成人免费视频97| 搡老女人一区二区三区视频tv| 永久555www成人免费| 91精品视频在线| 欧美激情精品久久久久久| 欧美富婆性猛交| 欧美理论在线观看| 国产精品扒开腿做爽爽爽的视频| 亚洲人午夜精品| 欧美精品在线视频观看| 国产精品视频999| 亚洲精品日韩久久久| 亚洲欧美日韩区|