RANK (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 子句的<資料列或範圍子句>不能為 RANK 函數指定。 如需詳細資訊,請參閱<OVER 子句 (Transact-SQL)>。
傳回類型
bigint
備註
如果針對某個次序聯結了兩個或更多資料列,每個聯結的資料列都會收到相同的次序。 例如,如果兩位超級業務員有相同的 SalesYTD 值,將會並列第一。 SalesYTD 次高的業務員會排名第三,因為有兩個資料列次序比它高。 因此,RANK 函數不一定會傳回連續整數。
整個查詢所用的排序順序,決定了資料列在結果集中的出現順序。
範例
A.排序資料分割中的資料列
下列範例會根據庫存產品數量來排列指定的庫存位置之庫存產品的次序。 LocationID 分割結果集,而 Quantity 邏輯地排序結果集。 請注意產品 494 和 495 具相同的數量。 因為它們綁在一起,且它們同時排名為一。
USE AdventureWorks2012;
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 AdventureWorks2012
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 8
4 29.8462 19
5 32.6923 16
6 32.6923 16
7 50.4808 6
8 40.8654 10
9 40.8654 10
10 42.4808 9