RANK (Transact-SQL)

結果セットのパーティション内の各行の順位を返します。 行の順位は、その行より上にある順位の数に 1 を加えたものです。

トピック リンク アイコン Transact-SQL 構文表記規則

構文

RANK ( ) OVER ( [ partition_by_clause ] order_by_clause )

引数

  • OVER ( [ partition_by_clause ] order_by_clause**)**
    partition_by_clause は、FROM 句で生成された結果セットをパーティションに分割します。このパーティションに関数が適用されます。 指定しない場合、関数ではクエリ結果セットのすべての行を 1 つのグループとして扱います。 order_by_clause は、関数を適用する前にデータの順序を決定します。 order_by_clause は必須です。 OVER 句の <行または範囲句> は、RANK 関数では指定できません。 詳細については、「OVER 句 (Transact-SQL)」を参照してください。

戻り値の型

bigint

説明

複数の行が 1 つの順位を分け合う場合は、それぞれの行に同じ順位が付けられます。 たとえば、上位 2 人の販売員の SalesYTD 値が同じである場合は、両方に順位 1 が付けられます。 SalesYTD が次に高い販売員には、順位 3 が付けられます。順位のより高い行が 2 つあるためです。 そのため、RANK 関数は連続した整数を返すとは限りません。

クエリ全体に使用される並べ替え順によって、結果セットにおける行の順序が決まります。

使用例

A. パーティション内の行に順位を付ける

次の例では、指定された在庫場所の在庫内の製品を数量に応じて順位付けしています。 結果セットは LocationID によってパーティションに分割され、Quantity によって論理的に順序付けされます。 494 と 495 の製品が同じ数量であることを確認します。 これらは数量が同じなので、両方とも順位が 1 位になっています。

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)