Database
 sql >> Datenbank >  >> RDS >> Database

So nummerieren Sie Zeilen in SQL

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