適用於:SQL Server
Azure SQL 資料庫
Azure SQL 受控執行個體
Azure Synapse Analytics
分析平台系統(PDW)
Microsoft 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 (Property) 和 CREATE SEQUENCE。
語法
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 不具決定性。 如需詳細資訊,請參閱確定性與非確定性函式。
範例
本文中的程式代碼範例會使用 AdventureWorks2025 或 AdventureWorksDW2025 範例資料庫,您可以從 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