DENSE_RANK (Transact-SQL)

結果セットのパーティションにおける行の順位を返します。この順位付けではギャップが発生しません。 行の順位は、対象となる行より 1 つ前の順位の番号に 1 を加算したものになります。

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

構文

DENSE_RANK ( ) OVER ( [ <partition_by_clause> ] < order_by_clause > )

引数

  • <partition_by_clause>
    FROM 句で生成された結果セットをパーティションに分割します。このパーティションに DENSE_RANK 関数が適用されます。 PARTITION BY の構文については、「OVER 句 (Transact-SQL)」を参照してください。

  • <order_by_clause>
    DENSE_RANK 関数がパーティション内の行に適用される順序を決定します。

戻り値の型

bigint

説明

同じパーティションで複数の行が 1 つの順位を分け合う場合は、それぞれの行に同じ順位が付けられます。 たとえば、上位 2 人の販売員の SalesYTD 値が同じである場合は、両方に順位 1 が付けられます。 SalesYTD が次に高い販売員には、順位 2 が付きます。 これは、この行より前の行の番号に 1 を加えたものです。 したがって、DENSE_RANK 関数からは、常に番号のギャップが発生しない連続する順位番号が返されます。

クエリ全体に使用される並べ替え順序によって、結果における行の順序が決まります。 つまり、順位が 1 位である行が必ずしもパーティションの先頭の行とは限りません。

使用例

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

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

USE AdventureWorks2012;
GO
SELECT i.ProductID, p.Name, i.LocationID, i.Quantity
    ,DENSE_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       2
496         Paint - Yellow                     3          30       3
492         Paint - Black                      3          17       4
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 句が指定されていないため、DENSE_RANK 関数は結果セットのすべての行に適用されます。

USE AdventureWorks2012;
GO
SELECT TOP(10) BusinessEntityID, Rate, 
       DENSE_RANK() OVER (ORDER BY Rate DESC) AS RankBySalary
FROM HumanResources.EmployeePayHistory;

以下に結果セットを示します。

BusinessEntityID Rate                  RankBySalary
---------------- --------------------- --------------------
1                125.50                1
25               84.1346               2
273              72.1154               3
2                63.4615               4
234              60.0962               5
263              50.4808               6
7                50.4808               6
234              48.5577               7
285              48.101                8
274              48.101                8

関連項目

参照

RANK (Transact-SQL)

ROW_NUMBER (Transact-SQL)

NTILE (Transact-SQL)

順位付け関数 (Transact-SQL)

組み込み関数 (Transact-SQL)