ROW_NUMBERの使い方

6497 ワード

変換元:http://msdn.microsoft.com/zh-cn/library/ms186734.aspx
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()のクエリが返すローは、次の条件が成立しない限り、実行のたびに完全に同じ順序で維持されます.
  • パーティション列の値は一意です.
  • ORDER BY列の値は一意です.
  • パーティション列と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;
    

    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