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

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

SQL Server 排序函數 ROW_NUMBER和RANK 用法總結

2024-08-31 00:59:27
字體:
來源:轉載
供稿:網友

1.ROW_NUMBER()基本用法:

SELECT
  SalesOrderID,
  CustomerID,
  ROW_NUMBER() OVER (ORDER BY SalesOrderID) AS RowNumber
 FROM Sales.SalesOrderHeader
結果集:
SalesOrderID    CustomerID    RowNumber
--------------- ------------- ---------------
43659           676           1
43660           117           2
43661           442           3
43662           227           4
43663           510           5
43664           397           6
43665           146           7
43666           511           8
43667           646           9
 :

2.RANK()基本用法:

SELECT
  SalesOrderID,
  CustomerID,
  RANK() OVER (ORDER BY CustomerID) AS Rank
 FROM Sales.SalesOrderHeader
結果集:
SalesOrderID    CustomerID    Rank
--------------- ------------- ----------------
43860           1             1
44501           1             1
45283           1             1
46042           1             1
46976           2             5
47997           2             5
49054           2             5
50216           2             5
51728           2             5
57044           2             5
63198           2             5
69488           2             5
44124           3             13
 :

3.利用CTE來過濾ROW_NUMBER()的用法:

WITH NumberedRows AS
(
  SELECT
    SalesOrderID,
    CustomerID,
    ROW_NUMBER() OVER (ORDER BY SalesOrderID) AS RowNumber
   FROM Sales.SalesOrderHeader
)

SELECT * FROM NumberedRows
 WHERE RowNumber BETWEEN 100 AND 200
結果集:

SalesOrderID    CustomerID    RowNumber
--------------- ------------- --------------
43759           13257         100
43760           16352         101
43761           16493         102
 :
43857           533           199
43858           36            200

4.帶Group by的ROW_NUMBER()用法:

WITH CustomerSum
AS
(
  SELECT CustomerID, SUM(TotalDue) AS TotalAmt
   FROM Sales.SalesOrderHeader
   GROUP BY CustomerID
)
SELECT
  *,
  ROW_NUMBER() OVER (ORDER BY TotalAmt DESC) AS RowNumber
 FROM CustomerSum
結果集:
CustomerID    TotalAmt        RowNumber
------------- --------------- ---------------
678           1179857.4657    1
697           1179475.8399    2
170           1134747.4413    3
328           1084439.0265    4
514           1074154.3035    5
155           1045197.0498    6
72            1005539.7181    7
 :

5.ROW_NUMBER()或是RANK()聚合用法:

WITH CustomerSum AS
(
  SELECT CustomerID, SUM(TotalDue) AS TotalAmt
   FROM Sales.SalesOrderHeader
   GROUP BY CustomerID
)
SELECT  *,
  RANK() OVER (ORDER BY TotalAmt DESC) AS Rank
--或者是ROW_NUMBER() OVER (ORDER BY TotalAmt DESC) AS Row_Number
 FROM CustomerSum
RANK()的結果集:
CustomerID  TotalAmt              Rank
----------- --------------------- --------------------
678         1179857.4657          1
697         1179475.8399          2
170         1134747.4413          3
328         1084439.0265          4
514         1074154.3035          5
 :

6.DENSE_RANK()基本用法:

SELECT
  SalesOrderID,
  CustomerID,
  DENSE_RANK() OVER (ORDER BY CustomerID) AS DenseRank
 FROM Sales.SalesOrderHeader
 WHERE CustomerID > 100
結果集:
SalesOrderID CustomerID  DenseRank
------------ ----------- --------------------
46950        101         1
47979        101         1
49048        101         1
50200        101         1
51700        101         1
57022        101         1
63138        101         1
69400        101         1
43855        102         2
44498        102         2
45280        102         2
46038        102         2
46951        102         2
47978        102         2
49103        102         2
50199        102         2
51733        103         3
57058        103         3
 :

7.RANK()與DENSE_RANK()的比較:

WITH CustomerSum AS
(
  SELECT
    CustomerID,
    ROUND(CONVERT(int, SUM(TotalDue)) / 100, 8) * 100 AS TotalAmt
   FROM Sales.SalesOrderHeader
   GROUP BY CustomerID
)
SELECT *,
  RANK() OVER (ORDER BY TotalAmt DESC) AS Rank,
  DENSE_RANK() OVER (ORDER BY TotalAmt DESC) AS DenseRank
 FROM CustomerSum
結果集:
CustomerID  TotalAmt    Rank    DenseRank
----------- ----------- ------- --------------------
697         1272500     1       1
678         1179800     2       2
170         1134700     3       3
328         1084400     4       4
 :
87          213300      170     170
667         210600      171     171
196         207700      172     172
451         206100      173     173
672         206100      173     173
27          205200      175     174
687         205200      175     174
163         204000      177     175
102         203900      178     176
 :

8.NTILE()基本用法:

SELECT
  SalesOrderID,
  CustomerID,
  NTILE(10000) OVER (ORDER BY CustomerID) AS NTile
 FROM Sales.SalesOrderHeader
結果集:
SalesOrderID    CustomerID    NTile
--------------- ------------- ---------------
43860           1             1
44501           1             1
45283           1             1
46042           1             1
46976           2             2
47997           2             2
49054           2             2
50216           2             2
51728           2             3
57044           2             3
63198           2             3
69488           2             3
44124           3             4
 :
45024           29475         9998
45199           29476         9998
60449           29477         9998
60955           29478         9999
49617           29479         9999
62341           29480         9999
45427           29481         10000
49746           29482         10000
49665           29483         10000

9.所有排序方法對比:

SELECT
  SalesOrderID AS OrderID,
  CustomerID,
  ROW_NUMBER() OVER (ORDER BY CustomerID) AS RowNumber,
  RANK() OVER (ORDER BY CustomerID) AS Rank,
  DENSE_RANK() OVER (ORDER BY CustomerID) AS DenseRank,
  NTILE(10000) OVER (ORDER BY CustomerID) AS NTile
 FROM Sales.SalesOrderHeader
結果集:
OrderID  CustomerID    RowNumber Rank    DenseRank NTile
-------- ------------- --------- ------- --------- --------
43860    1             1         1       1         1
44501    1             2         1       1         1
45283    1             3         1       1         1
46042    1             4         1       1         1
46976    2             5         5       2         2
47997    2             6         5       2         2
49054    2             7         5       2         2
50216    2             8         5       2         2
51728    2             9         5       2         3
57044    2             10        5       2         3
63198    2             11        5       2         3
69488    2             12        5       2         3
44124    3             13        13      3         4
44791    3             14        13      3         4
 :

10.PARTITION BY基本使用方法:

SELECT
  SalesOrderID,
  SalesPersonID,
  OrderDate,
  ROW_NUMBER() OVER (PARTITION BY SalesPersonID ORDER BY OrderDate) AS OrderRank
 FROM Sales.SalesOrderHeader
 WHERE SalesPersonID IS NOT NULL
結果集:
SalesOrderID    SalesPersonID    OrderDate    OrderRank
--------------- ---------------- ------------ --------------
 :
43659           279              2001-07-01 00:00:00.000    1
43660           279              2001-07-01 00:00:00.000    2
43681           279              2001-07-01 00:00:00.000    3
43684           279              2001-07-01 00:00:00.000    4
43685           279              2001-07-01 00:00:00.000    5
43694           279              2001-07-01 00:00:00.000    6
43695           279              2001-07-01 00:00:00.000    7
43696           279              2001-07-01 00:00:00.000    8
43845           279              2001-08-01 00:00:00.000    9
43861           279              2001-08-01 00:00:00.000    10
 :
48079           287              2002-11-01 00:00:00.000    1
48064           287              2002-11-01 00:00:00.000    2
48057           287              2002-11-01 00:00:00.000    3
47998           287              2002-11-01 00:00:00.000    4
48001           287              2002-11-01 00:00:00.000    5
48014           287              2002-11-01 00:00:00.000    6
47982           287              2002-11-01 00:00:00.000    7
47992           287              2002-11-01 00:00:00.000    8
48390           287              2002-12-01 00:00:00.000    9
48308           287              2002-12-01 00:00:00.000    10
 :


11.PARTITION BY聚合使用方法:
WITH CTETerritory AS
(
  SELECT
    cr.Name AS CountryName,
    CustomerID,
    SUM(TotalDue) AS TotalAmt
   FROM
    Sales.SalesOrderHeader AS soh
    INNER JOIN Sales.SalesTerritory AS ter ON soh.TerritoryID = ter.TerritoryID
    INNER JOIN Person.CountryRegion AS cr ON cr.CountryRegionCode = ter.
CountryRegionCode
   GROUP BY
    cr.Name, CustomerID
)
SELECT
  *,
  RANK() OVER(PARTITION BY CountryName ORDER BY TotalAmt, CustomerID DESC) AS Rank
 FROM CTETerritory


結果集:

CountryName    CustomerID    TotalAmt    Rank
-------------- ------------- ----------- --------------
Australia      29083         4.409       1
Australia      29061         4.409       2
Australia      29290         5.514       3
Australia      29287         5.514       4
Australia      28924         5.514       5
 :
Canada         29267         5.514       1
Canada         29230         5.514       2
Canada         28248         5.514       3
Canada         27628         5.514       4
Canada         27414         5.514       5
 :
France         24538         4.409       1
France         24535         4.409       2
France         23623         4.409       3
France         23611         4.409       4
France         20961         4.409       5
 :

12.PARTITION BY求平均數使用方法:

WITH CTETerritory AS
(
  SELECT
    cr.Name AS CountryName,
    CustomerID,
    SUM(TotalDue) AS TotalAmt
   FROM
    Sales.SalesOrderHeader AS soh
    INNER JOIN Sales.SalesTerritory AS ter ON soh.TerritoryID = ter.TerritoryID
    INNER JOIN Person.CountryRegion AS cr ON cr.CountryRegionCode = ter.
CountryRegionCode
   GROUP BY
    cr.Name, CustomerID
)
SELECT
  *,
  RANK() OVER (PARTITION BY CountryName ORDER BY TotalAmt, CustomerID DESC) AS Rank,
  AVG(TotalAmt) OVER(PARTITION BY CountryName) AS Average
 FROM CTETerritory


結果集:

CountryName    CustomerID    TotalAmt    Rank    Average
-------------- ------------- ----------- ------- ------------------
Australia      29083         4.409       1       3364.8318
Australia      29061         4.409       2       3364.8318
Australia      29290         5.514       3       3364.8318
 :
Canada         29267         5.514       1       12824.756
Canada         29230         5.514       2       12824.756
Canada         28248         5.514       3       12824.756

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品极品尤物在线观看| 精品国产91久久久久久| 国产精品久久久亚洲| 国产精品视频精品视频| 高清欧美性猛交| 亚洲自拍av在线| 久久夜色精品国产欧美乱| 亚洲午夜色婷婷在线| 亚洲小视频在线| 最近2019中文字幕第三页视频| 日本中文字幕成人| 狠狠躁18三区二区一区| 91九色蝌蚪国产| 日韩久久精品成人| 欧美高清视频免费观看| 日韩精品欧美激情| 欧美亚洲视频在线观看| 久久久久999| 亚洲国产毛片完整版| 一区二区成人精品| 高清一区二区三区日本久| 69av在线播放| 亚洲自拍小视频免费观看| 国产精品69久久| 美女av一区二区三区| 美女精品久久久| 欧美大肥婆大肥bbbbb| 亚洲一级黄色片| 久久成人精品一区二区三区| 亚洲欧美日韩在线高清直播| 欧美日韩xxxxx| 日韩在线免费视频观看| 91精品国产综合久久香蕉922| 中文日韩电影网站| 国产91精品久久久| 久久久久久久久亚洲| 亚洲欧美日韩精品久久亚洲区| 亚洲va国产va天堂va久久| 亚洲高清免费观看高清完整版| 神马国产精品影院av| 青青草国产精品一区二区| 色噜噜亚洲精品中文字幕| 中文欧美日本在线资源| 亚洲 日韩 国产第一| 91精品国产自产91精品| 国产91色在线免费| 久久精品国产2020观看福利| 18性欧美xxxⅹ性满足| 亚洲一区二区自拍| 欧美精品久久久久久久久久| 久久男人资源视频| 国产精品一区二区三区毛片淫片| 欧美性做爰毛片| 亚洲成色www8888| 亚洲第一页在线| 精品国产老师黑色丝袜高跟鞋| 97在线免费观看视频| 精品久久久久国产| 久久av资源网站| 亚洲精品videossex少妇| 国产91精品最新在线播放| 97香蕉久久夜色精品国产| 宅男66日本亚洲欧美视频| 4k岛国日韩精品**专区| www国产精品视频| 中文字幕国产精品| 精品久久久久久久久中文字幕| 国产精品69av| 在线视频亚洲欧美| 欧美在线免费观看| 亚洲激情 国产| 欧美精品在线观看| 91精品视频在线| 欧美精品18videos性欧美| 欧美在线视频在线播放完整版免费观看| 欧美成人中文字幕| 91国产中文字幕| 亚洲成**性毛茸茸| 伦伦影院午夜日韩欧美限制| 最近2019年手机中文字幕| 成人欧美一区二区三区黑人孕妇| 5566日本婷婷色中文字幕97| 欧美美女18p| 91理论片午午论夜理片久久| 欧美老女人bb| 青青a在线精品免费观看| 国产日韩在线一区| 亚洲码在线观看| 亚洲欧美成人一区二区在线电影| 一区二区日韩精品| 九九热这里只有精品6| 日韩久久精品电影| 国产婷婷色综合av蜜臀av| 久久电影一区二区| 91视频九色网站| 91精品一区二区| 国产丝袜高跟一区| 成人免费网视频| 欧美视频在线观看免费网址| 日本中文字幕不卡免费| 亚洲精品久久久久久久久久久| 91网站在线看| 久久精品这里热有精品| 亚洲综合精品伊人久久| 中文日韩在线视频| 欧美中文字幕视频在线观看| 国产精品第一区| 亚洲天堂av在线免费| 97在线看福利| 精品免费在线观看| 亚洲曰本av电影| 成人黄色短视频在线观看| 日韩影视在线观看| 中文字幕无线精品亚洲乱码一区| 日韩精品视频在线免费观看| 欧美日韩国产精品专区| 亚洲男人的天堂在线播放| 国产午夜一区二区| 亚洲欧美日韩高清| 热门国产精品亚洲第一区在线| 欧美午夜片欧美片在线观看| 性色av一区二区三区| 日韩专区在线观看| 国模叶桐国产精品一区| 国产一区二区三区视频免费| 成人激情视频小说免费下载| 夜夜嗨av色一区二区不卡| 国产精品日韩精品| 日韩电影免费在线观看| 久久久国产影院| 91精品国产高清久久久久久91| 久久久久亚洲精品| 91麻豆桃色免费看| 国产成人精品综合| 26uuu日韩精品一区二区| 日韩精品中文字幕视频在线| 国产精品视频导航| 久久免费视频这里只有精品| 精品亚洲永久免费精品| 亚洲一区av在线播放| 国产成人精彩在线视频九色| 久久99精品久久久久久青青91| 97激碰免费视频| 国产精品情侣自拍| 91香蕉电影院| 亚洲精品www| 福利微拍一区二区| 日韩av网址在线观看| 国产中文字幕亚洲| 亚洲午夜国产成人av电影男同| 国语自产精品视频在线看一大j8| 日韩精品在线私人| 一区二区三区 在线观看视| 国产亚洲欧美一区| 日本伊人精品一区二区三区介绍| 欧美成人中文字幕| 久久国产加勒比精品无码| 久久中文字幕一区| 91高清视频免费| 久久99久久久久久久噜噜| 欧美性黄网官网| 日韩精品极品在线观看| 91青草视频久久| 成人国产精品一区|