ROW_NUMBERの使い方
変換元:http://msdn.microsoft.com/zh-cn/library/ms186734.aspx
ROW_NUMBER (Transact-SQL)
SQL Server 2012
その他のバージョン
このトピックは評価されていません-このトピックを評価します
結果セットのパーティション内の行のシリアル番号を返します.各パーティションの最初の行は1から始まります.
Transact-SQL構文規則
構文
パラメータ
PARTITION BY
value_expression
FROM句生成の結果セットをROW_を適用するNUMBER関数のパーティション. value_expressionは、結果セットをパーティション化するカラムを指定します.PARTION BYが指定されていない場合、この関数はクエリ結果セットのすべてのローを単一のグループとして扱います.詳細については、OVER句(Transact-SQL)を参照してください.
order_by_clause
ORDER BY句は、特定のパーティションにおいて行に一意のROW_を割り当てることを決定するNUMBERの順番.必要です.詳細については、OVER句(Transact-SQL)を参照してください.
戻りタイプ
bigint
一般コメント
ROWの使用は保証されていませんNUMBER()のクエリが返すローは、次の条件が成立しない限り、実行のたびに完全に同じ順序で維持されます.パーティション列の値は一意です. ORDER BY列の値は一意です. パーティション列とORDER BY列の値の組み合わせは一意です.
例
A.営業担当者の明細番号を返す
次の例では、営業担当者の年初から現在までの売上高に基づいて、Adventure Works Cyclesの営業担当者の行番号を計算します.
Here is the result set.
B.戻り行のサブセット
次の例では、SalesOrderHeaderテーブル内のすべてのローのロー番号をOrderDateの順序で計算し、ロー50~60(含む)のみを返します.
C.将ROW_NUMBER()はPARTITIONと併用
次の例では、PARTION BYパラメータを使用して、結果セットを列TerritoryNameでパーティション化します.OVER句で指定したORDER BY句は、各パーティションの行を列SalesyTDごとにソートします.SELECT文のORDER BYは、クエリ結果セット全体をTerritoryName句でソートします.
Here is the result set.
ROW_NUMBER (Transact-SQL)
SQL Server 2012
その他のバージョン
このトピックは評価されていません-このトピックを評価します
結果セットのパーティション内の行のシリアル番号を返します.各パーティションの最初の行は1から始まります.
Transact-SQL構文規則
構文
ROW_NUMBER ( )
OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause )
パラメータ
PARTITION BY
value_expression
FROM句生成の結果セットをROW_を適用するNUMBER関数のパーティション. value_expressionは、結果セットをパーティション化するカラムを指定します.PARTION BYが指定されていない場合、この関数はクエリ結果セットのすべてのローを単一のグループとして扱います.詳細については、OVER句(Transact-SQL)を参照してください.
order_by_clause
ORDER BY句は、特定のパーティションにおいて行に一意のROW_を割り当てることを決定するNUMBERの順番.必要です.詳細については、OVER句(Transact-SQL)を参照してください.
戻りタイプ
bigint
一般コメント
ROWの使用は保証されていませんNUMBER()のクエリが返すローは、次の条件が成立しない限り、実行のたびに完全に同じ順序で維持されます.
例
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;
Here is the result set.
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と併用
次の例では、PARTION 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;
Here is the result set.
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