Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Funktionsweise von ROW_NUMBER() in SQL Server

In SQL Server die ROW_NUMBER() Mit der Funktion können Sie die Ausgabe einer Ergebnismenge nummerieren. Es gibt die fortlaufende Nummer jeder Zeile zurück, beginnend bei 1.

Wenn Sie Partitionen für die Ergebnismenge angeben, bewirkt jede Partition, dass die Nummerierung erneut beginnt (d. h. die Nummerierung beginnt bei 1 für die erste Zeile in jeder Partition).

Syntax

Die Syntax lautet wie folgt:

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

PARTITION BY value_expression es ist optional. Es teilt die von FROM erzeugte Ergebnismenge -Klausel in Partitionen, auf die die Funktion angewendet wird. Wertausdruck gibt die Spalte an, nach der die Ergebnismenge partitioniert wird. Wenn die PARTITION BY -Klausel nicht angegeben ist, werden alle Zeilen der Ergebnismenge der Abfrage als eine einzige Gruppe behandelt.

erforderlich. Es bestimmt die Reihenfolge, in der den Zeilen ihre eindeutige ROW_NUMBER zugewiesen wird innerhalb einer bestimmten Partition.

Beachten Sie, dass OVER -Klausel akzeptiert normalerweise eine , aber dieses Argument kann mit dieser Funktion nicht verwendet werden.

Beispiel 1 – Grundlegende Verwendung

Hier ist ein einfaches Beispiel, das zeigt, wie diese Funktion funktioniert:

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

Ergebnis:

+-------+-----------+--------------------------+
| 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                   |
+-------+-----------+--------------------------+

In diesem Fall können wir sehen, dass die Zeilennummern perfekt mit den Werten in AlbumId übereinstimmen Säule. Das ist rein zufällig. Dies geschieht, weil die AlbumId Spalte verwendet einen inkrementierenden Wert, der bei 1 beginnt, was auch ROW_NUMBER() ist Verwendet.

Die Zeilennummerierung korreliert mit der AlbumId Spalte in dem Maße, in dem sie nach dieser Spalte geordnet ist. Das bedeutet aber nicht, dass die Werte gleich sein müssen.

Beispiel 2 – Fügen Sie eine WHERE-Klausel hinzu

Hinzufügen eines WHERE Klausel wird zeigen, was ich meine.

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

Ergebnis:

+-------+-----------+-------------------------+
| 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                  |
+-------+-----------+-------------------------+

Beispiel 3 – Ändern Sie die Reihenfolge

Auch die Sortierung in absteigender statt aufsteigender Reihenfolge demonstriert dieses Konzept.

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

Ergebnis:

+-------+-----------+--------------------------+
| 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               |
+-------+-----------+--------------------------+

Beispiel 4 – Sortieren nach einer anderen Spalte

Und wenn wir schon dabei sind, ordnen wir nach dem AlbumName Spalte statt.

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

Ergebnis:

+-------+-----------+--------------------------+
| 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   |
+-------+-----------+--------------------------+

Beispiel 5 – Partitionen

Wie erwähnt, können Sie die Ergebnisse auch in Partitionen aufteilen. Dabei beginnt die Nummerierung für jede neue Partition wieder bei 1.

Beispiel:

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;

Ergebnis:

+---------+-------+-----------+--------------------------+
| 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  |
+---------+-------+-----------+--------------------------+

Wieder einmal können wir sehen, dass die ROW_NUMBER und die AlbumId Spalten sind völlig unkorreliert.

In diesem Fall unterteile ich nach dem Genre Säule. Dadurch beginnt die Nummerierung für jedes Genre wieder bei 1.