DENSE_RANK (Transact-SQL)
結果セットのパーティションにおける行の順位を返します。この順位付けではギャップが発生しません。 行の順位は、対象となる行より 1 つ前の順位の番号に 1 を加算したものになります。
構文
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