等級(Transact-SQL)

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Azure Synapse AnalyticsMicrosoft Fabric 中的 SQL 分析端點Microsoft Fabric 中的倉庫Microsoft Fabric 中的 SQL 資料庫

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

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

注意

RANK 是查詢在執行時所計算的暫存值。 要在表格中持久化數字,請參見 IDENTITY (性質) 和 CREATE 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 為必要項目。 子句的 <rows or range clause> 無法OVER指定為函RANK式。 如需詳細資訊,請參閱 SELECT - OVER 子句。

傳回類型

bigint

備註

若針對某個次序繫結兩個或更多資料列,每個繫結的資料列都會收到相同的次序。 例如,如果兩位頂尖銷售人員的價值相同 SalesYTD ,他們都會被評為一。 排名次 SalesYTD 高的銷售員排第三,因為有兩排排排名較高。 因此,函 RANK 數並不總是回傳連續的整數。

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

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

關於視窗函數效能調整的指引,請參見 OVER() 效能考量。

範例

本文的程式碼範例使用AdventureWorks2025了 、 AdventureWorksDW2025或AdventureWorksLT2025範例資料庫,你可以從 Azure Data SQL 範例庫 GitHub 下載。

A. 分割區內的階列

下列範例會根據庫存產品數量來排列指定庫存位置的庫存產品次序。 LocationID 分割結果集,而 Quantity 邏輯地排序結果集。 在位置3,產品494和495的數量相同。 因為他們打成平手,所以都排在第一名。

USE AdventureWorks2025;
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;

結果集如下所示。

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

B. 對結果集中的所有列進行排名

以下範例會回傳依薪資排名前十的員工。 由於未指定子 PARTITION BY 句,函 RANK 式會套用到結果集中的所有列。

USE AdventureWorks2025;
GO

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

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

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

-- Uses AdventureWorks
SELECT e.LastName,
       st.SalesTerritoryGroup,
       SUM(sq.SalesAmountQuota) AS TotalSales,
       RANK() OVER (PARTITION BY st.SalesTerritoryGroup ORDER BY SUM(sq.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 e.SalesPersonFlag = 1
      AND st.SalesTerritoryGroup <> N'NA'
GROUP BY e.LastName, st.SalesTerritoryGroup;

結果集如下所示。

LastName           SalesTerritoryGroup  TotalSales   RankResult
------------------ -------------------- ------------ -----------
Pak                Europe               10514000.00  1
Varkey Chudukatil  Europe               5557000.00   2
Valdez             Europe               2287000.00   3
Carson             North America        12198000.00  1
Mitchell           North America        11786000.00  2
Blythe             North America        11162000.00  3
Reiter             North America        8541000.00   4
Ito                North America        7804000.00   5
Saraiva            North America        7098000.00   6
Vargas             North America        4365000.00   7
Campbell           North America        4025000.00   8
Ansman-Wolfe       North America        3551000.00   9
Mensa-Annan        North America        2753000.00   10
Tsoflias           Pacific              1687000.00   1