Share via


ROW_NUMBER (Transact-SQL)

結果セットのパーティション内の行について、各パーティションの最初の行を 1 とした連続する数値を返します。

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

構文

ROW_NUMBER ( ) 
    OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause )

引数

  • PARTITION BYvalue_expression
    FROM 句で生成された結果セットを、ROW_NUMBER 関数が適用されるパーティションに分割します。 value_expression は、結果セットをパーティションに分割するときに使用する列を指定します。 PARTITION BY を指定しない場合、関数ではクエリ結果セットのすべての行を 1 つのグループとして扱います。 詳細については、「OVER 句 (Transact-SQL)」を参照してください。

  • order_by_clause
    ORDER BY 句は、指定したパーティション内の行に一意の ROW_NUMBER を割り当てる順序を決定します。 この引数は必須です。 詳細については、「OVER 句 (Transact-SQL)」を参照してください。

戻り値の型

bigint

全般的な解説

以下の条件が満たされている場合を除き、ROW_NUMBER() を使用したクエリによって返される行が、実行ごとにまったく同じ順序になるという保証はありません。

  1. パーティション分割された行の値が一意である。

  2. ORDER BY 列の値が一意。

  3. パーティション分割された列と ORDER BY 列の値の組み合わせが一意。

使用例

A. 販売員の行番号を返す

次の例では、Adventure Works Cycles の販売員について、今年に入ってからの売り上げ順位に基づく行番号を返します。

USE AdventureWorks2012; 
GO
SELECT ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS Row, 
    FirstName, LastName, ROUND(SalesYTD,2,1) AS "Sales YTD" 
FROM Sales.vSalesPerson
WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0;

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

Row FirstName    LastName               SalesYTD
--- -----------  ---------------------- -----------------
1   Linda        Mitchell               4251368.54
2   Jae          Pak                    4116871.22
3   Michael      Blythe                 3763178.17
4   Jillian      Carson                 3189418.36
5   Ranjit       Varkey Chudukatil      3121616.32
6   José         Saraiva                2604540.71
7   Shu          Ito                    2458535.61
8   Tsvi         Reiter                 2315185.61
9   Rachel       Valdez                 1827066.71
10  Tete         Mensa-Annan            1576562.19
11  David        Campbell               1573012.93
12  Garrett      Vargas                 1453719.46
13  Lynn         Tsoflias               1421810.92
14  Pamela       Ansman-Wolfe           1352577.13

B. 行のサブセットを返す

次の例では、SalesOrderHeader テーブル内のすべての行の行番号を OrderDate の順序で計算し、50 から 60 までの行のみを返します。

USE AdventureWorks2012;
GO
WITH OrderedOrders AS
(
    SELECT SalesOrderID, OrderDate,
    ROW_NUMBER() OVER (ORDER BY OrderDate) AS RowNumber
    FROM Sales.SalesOrderHeader 
) 
SELECT SalesOrderID, OrderDate, RowNumber  
FROM OrderedOrders 
WHERE RowNumber BETWEEN 50 AND 60;

C. ROW_NUMBER() を PARTITION と共に使用する

次の例では、PARTITION BY 引数を使用して、列 TerritoryName を基準にクエリ結果セットをパーティションに分割します。 OVER 句に指定した ORDER BY 句によって、列 SalesYTD を基準に各パーティション内の行の順序付けが行われます。 SELECT ステートメントの ORDER BY 句によって、TerritoryName を基準にクエリ結果セット全体の順序付けが行われます。

USE AdventureWorks2012;
GO
SELECT FirstName, LastName, TerritoryName, ROUND(SalesYTD,2,1),
ROW_NUMBER() OVER(PARTITION BY TerritoryName ORDER BY SalesYTD DESC) AS Row
FROM Sales.vSalesPerson
WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0
ORDER BY TerritoryName;

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

FirstName  LastName             TerritoryName        SalesYTD      Row
---------  -------------------- ------------------   ------------  ---
Lynn       Tsoflias             Australia            1421810.92    1
José       Saraiva              Canada               2604540.71    1
Garrett    Vargas               Canada               1453719.46    2
Jillian    Carson               Central              3189418.36    1
Ranjit     Varkey Chudukatil    France               3121616.32    1
Rachel     Valdez               Germany              1827066.71    1
Michael    Blythe               Northeast            3763178.17    1
Tete       Mensa-Annan          Northwest            1576562.19    1
David      Campbell             Northwest            1573012.93    2
Pamela     Ansman-Wolfe         Northwest            1352577.13    3
Tsvi       Reiter               Southeast            2315185.61    1
Linda      Mitchell             Southwest            4251368.54    1
Shu        Ito                  Southwest            2458535.61    2
Jae        Pak                  United Kingdom       4116871.22    1

関連項目

参照

RANK (Transact-SQL)

DENSE_RANK (Transact-SQL)

NTILE (Transact-SQL)