Problem:
Sie möchten jeder Zeile in der Ergebnistabelle eine eigene Nummer geben.
Beispiel:
Unsere Datenbank hat eine Tabelle namens furniture
mit Daten in den folgenden Spalten:code
(Primärschlüssel) und name
.
Code | Name |
---|---|
101 | Bett |
202 | Sofa |
333 | Vorsitz |
123 | Bücherregal |
235 | Tabelle |
766 | Schreibtisch |
Die furniture
Tabelle speichert den Namen der Möbelstücke, die wir nummerieren möchten.
Lösung:
SELECT ROW_NUMBER() OVER() AS num_row, code, name FROM furniture;
Die Abfrage gibt die Zeilennummer jedes Möbelstücks zusammen mit seinem Namen und Code zurück:
num_row | Name | Code |
---|---|---|
1 | Bett | 101 |
2 | Sofa | 202 |
3 | Vorsitz | 333 |
4 | Bücherregal | 123 |
5 | Tabelle | 235 |
6 | Schreibtisch | 766 |
Beachten Sie, dass die Namen der Möbelstücke nicht sortiert sind.
Diskussion:
Wenn Sie jede Zeile in einer Ergebnismenge nummerieren möchten, stellt SQL die ROW_NUMBER()
bereit Funktion. Diese Funktion wird in einem SELECT
verwendet Klausel mit anderen Spalten. Nach ROW_NUMBER()
-Klausel rufen wir OVER()
auf Funktion. Wenn Sie Argumente an OVER
übergeben , wird die Nummerierung der Zeilen nicht nach Spalten sortiert. Somit ist die Reihenfolge der angezeigten Zeilen nicht deterministisch; In den meisten Fällen ist dies die Reihenfolge, in der die Datensätze in die Tabelle eingefügt wurden. Die Nummerierung der Zeilen beginnt bei 1. In unserem Beispiel hat jeder Datensatz eine Nummer von 1 bis 6.
Wir können Zeilennummern auch mithilfe einer Spalte zuweisen. Im folgenden Beispiel nummerieren wir Datensätze nach Namen sortiert. Dazu übergeben wir dieses Argument an OVER
zusammen mit ORDER BY
(es sortiert Datensätze nach der Namensspalte):
SELECT ROW_NUMBER() OVER(ORDER BY name) AS num_row, name, code FROM furniture;
Wenn Sie sich die Ergebnismenge ansehen, sehen Sie die sortierten Zeilen mit ihren Nummern:
Zeile | Name | Code |
---|---|---|
1 | Bett | 101 |
2 | Bücherregal | 123 |
3 | Vorsitz | 333 |
4 | Schreibtisch | 766 |
5 | Sofa | 202 |
6 | Tabelle | 235 |
Die von ROW_NUMBER()
bereitgestellte Nummerierung ist unabhängig von der Reihenfolge der Zeilen in der Ergebnistabelle. Im folgenden Beispiel nummerieren wir Datensätze unter Verwendung des sortierten Spaltennamens (OVER(ORDER BY name)
), aber wir zeigen Datensätze in der Ergebnismenge gemäß einer anderen Spalte an (in unserem Beispiel ORDER BY code
).
SELECT ROW_NUMBER() OVER(ORDER BY name) AS num_row, name, code FROM furniture ORDER BY code;
Die Abfrage hat die Nummer jeder Zeile zurückgegeben, aber diese Nummern sind nicht in aufsteigender Reihenfolge, da die Datensätze nach dem Spaltencode sortiert sind:
Zeile | Name | Code |
---|---|---|
1 | Bett | 101 |
2 | Bücherregal | 123 |
5 | Sofa | 202 |
6 | Tabelle | 235 |
3 | Vorsitz | 333 |
4 | Schreibtisch | 766 |
Die Standardreihenfolge der sortierten Zeilen ist aufsteigend, aber Sie können mit DESC
auch in absteigender Reihenfolge sortieren Stichwort nach dem Namen der Spalte, nach der Sie sortieren möchten:
SELECT ROW_NUMBER() OVER(ORDER BY name ASC) AS num_row, name, code FROM furniture ORDER BY code DESC;
Die obige Abfrage hat die Ergebnismenge zurückgegeben:
Zeile | Name | Code |
---|---|---|
4 | Schreibtisch | 766 |
3 | Vorsitz | 333 |
6 | Tabelle | 235 |
5 | Sofa | 202 |
2 | Bücherregal | 123 |
1 | Bett | 101 |