RANK (Transact-SQL)

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

主題連結圖示 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

請參閱

參考

DENSE_RANK (Transact-SQL)

ROW_NUMBER (Transact-SQL)

NTILE (Transact-SQL)

次序函數 (Transact-SQL)

內建函數 (Transact-SQL)