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 値がパーティション内の行に適用される順序を決定します。順位付け関数で使用される <order_by_clause> では、整数値で列を表すことはできません。

戻り値の型

bigint

説明

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

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

次の例では、さまざまな場所における製品の数量の DENSE_RANK を返します。OVER 句の ORDER BY によって DENSE_RANK が順序付けされ、SELECT ステートメントの ORDER BY によって結果セットが順序付けされることに注目してください。

USE AdventureWorks;
GO
SELECT i.ProductID, p.Name, i.LocationID, i.Quantity, 
    DENSE_RANK() OVER (PARTITION BY i.LocationID ORDER BY i.Quantity)     AS DENSE_RANK
FROM Production.ProductInventory i 
    INNER JOIN Production.Product p 
        ON i.ProductID = p.ProductID
ORDER BY Name;
GO