sql >> データベース >  >> RDS >> Sqlserver

SQL ServerでのROW_NUMBER()のしくみ

    SQL Serverでは、ROW_NUMBER() 関数を使用すると、結果セットの出力に番号を付けることができます。 1から始まる各行の連番を返します。

    結果セットにパーティションを指定すると、各パーティションによって番号付けが最初からやり直されます(つまり、各パーティションの最初の行の番号付けは1から始まります)。

    構文

    構文は次のようになります:

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

    PARTITION BY value_expression オプションです。 FROMによって生成された結果セットを分割します 関数が適用されるパーティションへの句。 value_expression 結果セットを分割する列を指定します。 PARTITION BYの場合 句が指定されていない場合、クエリ結果セットのすべての行が単一のグループとして扱われます。

    必要とされている。行に一意のROW_NUMBERが割り当てられる順序を決定します 指定されたパーティション内。

    OVERに注意してください 句は通常、を受け入れます 、ただし、その引数はこの関数では使用できません。

    例1-基本的な使用法

    この関数がどのように機能するかを示す基本的な例を次に示します。

    SELECT
      ROW_NUMBER() OVER (ORDER BY AlbumId ASC) 'Row',
      AlbumId,
      AlbumName
    FROM Albums;
    

    結果:

    +-------+-----------+--------------------------+
    | Row   | AlbumId   | AlbumName                |
    |-------+-----------+--------------------------|
    | 1     | 1         | Powerslave               |
    | 2     | 2         | Powerage                 |
    | 3     | 3         | Singing Down the Lane    |
    | 4     | 4         | Ziltoid the Omniscient   |
    | 5     | 5         | Casualties of Cool       |
    | 6     | 6         | Epicloud                 |
    | 7     | 7         | Somewhere in Time        |
    | 8     | 8         | Piece of Mind            |
    | 9     | 9         | Killers                  |
    | 10    | 10        | No Prayer for the Dying  |
    | 11    | 11        | No Sound Without Silence |
    | 12    | 12        | Big Swing Face           |
    | 13    | 13        | Blue Night               |
    | 14    | 14        | Eternity                 |
    | 15    | 15        | Scandinavia              |
    | 16    | 16        | Long Lost Suitcase       |
    | 17    | 17        | Praise and Blame         |
    | 18    | 18        | Along Came Jones         |
    | 19    | 19        | All Night Wrong          |
    | 20    | 20        | The Sixteen Men of Tain  |
    | 21    | 21        | Yo Wassup                |
    | 22    | 22        | Busted                   |
    +-------+-----------+--------------------------+
    

    この場合、行番号がAlbumIdの値と完全に一致していることがわかります。 桁。これはまったくの偶然です。これは、AlbumIdが原因で発生します 列は1から始まる増分値を使用しています。これは、ROW_NUMBER()でもあります。 を使用します。

    行番号はAlbumIdに関連付けられています その列によって順序付けられている範囲で列。ただし、値が同じである必要があるという意味ではありません。

    例2–WHERE句を追加する

    WHEREを追加する 条項は私が何を意味するかを示します。

    SELECT
      ROW_NUMBER() OVER (ORDER BY AlbumId ASC) 'Row',
      AlbumId,
      AlbumName
    FROM Albums
    WHERE AlbumId > 15;
    

    結果:

    +-------+-----------+-------------------------+
    | Row   | AlbumId   | AlbumName               |
    |-------+-----------+-------------------------|
    | 1     | 16        | Long Lost Suitcase      |
    | 2     | 17        | Praise and Blame        |
    | 3     | 18        | Along Came Jones        |
    | 4     | 19        | All Night Wrong         |
    | 5     | 20        | The Sixteen Men of Tain |
    | 6     | 21        | Yo Wassup               |
    | 7     | 22        | Busted                  |
    +-------+-----------+-------------------------+
    

    例3–順序を切り替える

    昇順ではなく降順で並べ替えることも、この概念を示しています。

    SELECT
      ROW_NUMBER() OVER (ORDER BY AlbumId DESC) 'Row',
      AlbumId,
      AlbumName
    FROM Albums;
    

    結果:

    +-------+-----------+--------------------------+
    | Row   | AlbumId   | AlbumName                |
    |-------+-----------+--------------------------|
    | 1     | 22        | Busted                   |
    | 2     | 21        | Yo Wassup                |
    | 3     | 20        | The Sixteen Men of Tain  |
    | 4     | 19        | All Night Wrong          |
    | 5     | 18        | Along Came Jones         |
    | 6     | 17        | Praise and Blame         |
    | 7     | 16        | Long Lost Suitcase       |
    | 8     | 15        | Scandinavia              |
    | 9     | 14        | Eternity                 |
    | 10    | 13        | Blue Night               |
    | 11    | 12        | Big Swing Face           |
    | 12    | 11        | No Sound Without Silence |
    | 13    | 10        | No Prayer for the Dying  |
    | 14    | 9         | Killers                  |
    | 15    | 8         | Piece of Mind            |
    | 16    | 7         | Somewhere in Time        |
    | 17    | 6         | Epicloud                 |
    | 18    | 5         | Casualties of Cool       |
    | 19    | 4         | Ziltoid the Omniscient   |
    | 20    | 3         | Singing Down the Lane    |
    | 21    | 2         | Powerage                 |
    | 22    | 1         | Powerslave               |
    +-------+-----------+--------------------------+
    

    例4–別の列で並べ替える

    その間、AlbumNameで注文しましょう 代わりに列。

    SELECT
      ROW_NUMBER() OVER (ORDER BY AlbumName ASC) 'Row',
      AlbumId,
      AlbumName
    FROM Albums;
    

    結果:

    +-------+-----------+--------------------------+
    | Row   | AlbumId   | AlbumName                |
    |-------+-----------+--------------------------|
    | 1     | 19        | All Night Wrong          |
    | 2     | 18        | Along Came Jones         |
    | 3     | 12        | Big Swing Face           |
    | 4     | 13        | Blue Night               |
    | 5     | 22        | Busted                   |
    | 6     | 5         | Casualties of Cool       |
    | 7     | 6         | Epicloud                 |
    | 8     | 14        | Eternity                 |
    | 9     | 9         | Killers                  |
    | 10    | 16        | Long Lost Suitcase       |
    | 11    | 10        | No Prayer for the Dying  |
    | 12    | 11        | No Sound Without Silence |
    | 13    | 8         | Piece of Mind            |
    | 14    | 2         | Powerage                 |
    | 15    | 1         | Powerslave               |
    | 16    | 17        | Praise and Blame         |
    | 17    | 15        | Scandinavia              |
    | 18    | 3         | Singing Down the Lane    |
    | 19    | 7         | Somewhere in Time        |
    | 20    | 20        | The Sixteen Men of Tain  |
    | 21    | 21        | Yo Wassup                |
    | 22    | 4         | Ziltoid the Omniscient   |
    +-------+-----------+--------------------------+
    

    例5–パーティション

    前述のように、結果をパーティションに分割することもできます。これを行うと、新しいパーティションごとに番号が1から始まります。

    例:

    SELECT
      Genre,
      ROW_NUMBER() OVER (PARTITION BY Genre ORDER BY AlbumId ASC) 'Row',
      AlbumId,
      AlbumName
    FROM Albums
    INNER JOIN Genres 
    ON Albums.GenreId = Genres.GenreId;
    

    結果:

    +---------+-------+-----------+--------------------------+
    | Genre   | Row   | AlbumId   | AlbumName                |
    |---------+-------+-----------+--------------------------|
    | Country | 1     | 3         | Singing Down the Lane    |
    | Country | 2     | 21        | Yo Wassup                |
    | Country | 3     | 22        | Busted                   |
    | Jazz    | 1     | 12        | Big Swing Face           |
    | Jazz    | 2     | 19        | All Night Wrong          |
    | Jazz    | 3     | 20        | The Sixteen Men of Tain  |
    | Pop     | 1     | 11        | No Sound Without Silence |
    | Pop     | 2     | 13        | Blue Night               |
    | Pop     | 3     | 14        | Eternity                 |
    | Pop     | 4     | 15        | Scandinavia              |
    | Pop     | 5     | 16        | Long Lost Suitcase       |
    | Pop     | 6     | 17        | Praise and Blame         |
    | Pop     | 7     | 18        | Along Came Jones         |
    | Rock    | 1     | 1         | Powerslave               |
    | Rock    | 2     | 2         | Powerage                 |
    | Rock    | 3     | 4         | Ziltoid the Omniscient   |
    | Rock    | 4     | 5         | Casualties of Cool       |
    | Rock    | 5     | 6         | Epicloud                 |
    | Rock    | 6     | 7         | Somewhere in Time        |
    | Rock    | 7     | 8         | Piece of Mind            |
    | Rock    | 8     | 9         | Killers                  |
    | Rock    | 9     | 10        | No Prayer for the Dying  |
    +---------+-------+-----------+--------------------------+
    

    もう一度、ROW_NUMBER およびAlbumId 列は完全に無相関です。

    この場合、Genreで分割します 桁。これにより、ジャンルごとに1から番号付けが再開されます。


    1. MySQLの特定の列の後に複数の列を追加する

    2. MongoDBまたは他のドキュメント指向データベースシステムをいつ使用するのですか?

    3. データベース全体のスクリプトSQL-Server

    4. SQLServer2005のINSERTWHERECOUNT(*)=0でのUNIQUEKEY制約への違反