共用方式為


RANK (Transact-SQL)

適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric 的 SQL 端點分析 Microsoft Fabric 的倉儲

傳回結果集分割區內,每個資料列的次序。 資料列的次序等於一加上前述資料列之前的次序數目。

ROW_NUMBER 和 RANK 很類似。 ROW_NUMBER 會依序為所有資料列編號 (例如 1、2、3、4、5)。 RANK 則為繫結提供相同的數值 (例如 1、2、2、4、5)。

注意

RANK 是查詢在執行時所計算的暫存值。 若要將數字保存在資料表中,請參閱 IDENTITY 屬性SEQUENCE

Transact-SQL 語法慣例

語法

RANK ( ) OVER ( [ partition_by_clause ] order_by_clause )  

引數

OVER ( [ partition_by_clause ] order_by_clause)
partition_by_clause 會將 FROM 子句產生的結果集分割成函數所要套用的分割區。 如未指定,此函數會將查詢結果集的所有資料列視為單一群組。 在套用函數之前,order_by_clause 可指定資料順序。 order_by_clause 為必要項目。 您無法為 RANK 函數指定 OVER 子句的<資料列或範圍子句/>。 如需詳細資訊,請參閱 OVER 子句 (Transact-SQL)

傳回型別

bigint

備註

若針對某個次序繫結兩個或更多資料列,每個繫結的資料列都會收到相同的次序。 例如,如果兩位超級業務員有相同的 SalesYTD 值,他們的次序便都是第一。 SalesYTD 次高的業務員之次序便是第三,因為有兩個資料列次序比它高。 因此,RANK 函數不一定會傳回連續整數。

整個查詢所用的排序順序,決定了資料列在結果集中的出現順序。

RANK 不具決定性。 如需詳細資訊,請參閱 決定性與非決定性函數

範例

A. 排序分割區中的資料列

下列範例會根據庫存產品數量來排列指定庫存位置的庫存產品次序。 LocationID 分割結果集,而 Quantity 邏輯地排序結果集。 請注意產品 494 和 495 具相同的數量。 因為它們綁在一起,且它們同時排名為一。

USE AdventureWorks2022;  
GO  
SELECT i.ProductID, p.Name, i.LocationID, i.Quantity  
    ,RANK() OVER   
    (PARTITION BY i.LocationID ORDER BY i.Quantity DESC) AS Rank  
FROM Production.ProductInventory AS i   
INNER JOIN Production.Product AS p   
    ON i.ProductID = p.ProductID  
WHERE i.LocationID BETWEEN 3 AND 4  
ORDER BY i.LocationID;  
GO  

結果集如下所示。

ProductID   Name                   LocationID   Quantity Rank  
----------- ---------------------- ------------ -------- ----  
494         Paint - Silver         3            49       1  
495         Paint - Blue           3            49       1  
493         Paint - Red            3            41       3  
496         Paint - Yellow         3            30       4  
492         Paint - Black          3            17       5  
495         Paint - Blue           4            35       1  
496         Paint - Yellow         4            25       2  
493         Paint - Red            4            24       3  
492         Paint - Black          4            14       4  
494         Paint - Silver         4            12       5  
 (10 row(s) affected)  

B. 排序結果集中的所有資料列

下列範例會依員工薪水的排序傳回前 10 位員工。 因為沒有指定 PARTITION BY 子句,RANK 函數應用到在結果集的所有資料列。

USE AdventureWorks2022  
SELECT TOP(10) BusinessEntityID, Rate,   
       RANK() OVER (ORDER BY Rate DESC) AS RankBySalary  
FROM HumanResources.EmployeePayHistory AS eph1  
WHERE RateChangeDate = (SELECT MAX(RateChangeDate)   
                        FROM HumanResources.EmployeePayHistory AS eph2  
                        WHERE eph1.BusinessEntityID = eph2.BusinessEntityID)  
ORDER BY BusinessEntityID;  

結果集如下所示。

BusinessEntityID Rate                  RankBySalary  
---------------- --------------------- --------------------  
1                125.50                1  
2                63.4615               4  
3                43.2692               11  
4                29.8462               28  
5                32.6923               22  
6                32.6923               22  
7                50.4808               6  
8                40.8654               14  
9                40.8654               14  
10               42.4808               13  

範例:Azure Synapse Analytics 和 Analytics Platform System (PDW)

C.排序分割區中的資料列

下列範例會根據其總銷售額,排列每個銷售領域內的銷售代表。 資料列集由 SalesTerritoryGroup 來進行資料分割,依照 SalesAmountQuota 來排序。

-- Uses AdventureWorks  
  
SELECT LastName, SUM(SalesAmountQuota) AS TotalSales, SalesTerritoryRegion,  
    RANK() OVER (PARTITION BY SalesTerritoryRegion ORDER BY SUM(SalesAmountQuota) DESC ) AS RankResult  
FROM dbo.DimEmployee AS e  
INNER JOIN dbo.FactSalesQuota AS sq ON e.EmployeeKey = sq.EmployeeKey  
INNER JOIN dbo.DimSalesTerritory AS st ON e.SalesTerritoryKey = st.SalesTerritoryKey  
WHERE SalesPersonFlag = 1 AND SalesTerritoryRegion != N'NA'  
GROUP BY LastName, SalesTerritoryRegion;  

結果集如下所示。

LastName          TotalSales     SalesTerritoryRegion  RankResult
----------------  -------------  -------------------  --------
Tsoflias          1687000.0000   Australia            1
Saraiva           7098000.0000   Canada               1
Vargas            4365000.0000   Canada               2
Carson            12198000.0000  Central              1
Varkey Chudukatil 5557000.0000   France               1
Valdez            2287000.0000   Germany              1
Blythe            11162000.0000  Northeast            1
Campbell          4025000.0000   Northwest            1
Ansman-Wolfe      3551000.0000   Northwest            2
Mensa-Annan       2753000.0000   Northwest            3
Reiter            8541000.0000   Southeast            1
Mitchell          11786000.0000  Southwest            1
Ito               7804000.0000   Southwest            2
Pak               10514000.0000  United Kingdom       1

另請參閱

DENSE_RANK (Transact-SQL)
ROW_NUMBER (Transact-SQL)
NTILE (Transact-SQL)
次序函數 (Transact-SQL)
內建函數 (Transact-SQL)