共用方式為


等級(Transact-SQL)

適用於:SQL ServerAzure SQL 資料庫Azure SQL 受控執行個體Azure Synapse Analytics分析平台系統(PDW)Microsoft Fabric 中的 SQL 分析端點Microsoft Fabric 中的倉儲Microsoft Fabric 中的 SQL 資料庫

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

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

注意

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

傳回類型

bigint

備註

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

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

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

範例

本文中的程式代碼範例會使用 AdventureWorks2025AdventureWorksDW2025 範例資料庫,您可以從 Microsoft SQL Server 範例和社群專案 首頁下載。

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 和 Analytics Platform System (PDW)

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