適用於:SQL Server
Azure SQL Database
Azure SQL 受控執行個體
Azure Synapse Analytics
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 (性質) 和 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 為必要項目。 子句的 <rows or range clause> 無法OVER指定為函RANK式。 如需詳細資訊,請參閱 SELECT - OVER 子句。
傳回類型
bigint
備註
若針對某個次序繫結兩個或更多資料列,每個繫結的資料列都會收到相同的次序。 例如,如果兩位頂尖銷售人員的價值相同 SalesYTD ,他們都會被評為一。 排名次 SalesYTD 高的銷售員排第三,因為有兩排排排名較高。 因此,函 RANK 數並不總是回傳連續的整數。
整個查詢所用的排序順序,決定了資料列在結果集中的出現順序。
RANK 不具決定性。 如需詳細資訊,請參閱確定性與非確定性函式。
關於視窗函數效能調整的指引,請參見 OVER() 效能考量。
範例
本文中的程式碼範例使用AdventureWorks2025了 or AdventureWorksDW2025 範例資料庫,你可以從 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