sql >> Databasteknik >  >> RDS >> Database

Hur man numrerar rader i SQL

Problem:

Du skulle vilja ge varje rad i resultattabellen ett separat nummer.

Exempel:

Vår databas har en tabell som heter furniture med data i följande kolumner:code (primärnyckel) och name .

kod namn
101 säng
202 soffa
333 stol
123 bokhylla
235 tabell
766 skrivbord

furniture bord lagrar namnet på möbler som vi vill numrera.

Lösning:

SELECT ROW_NUMBER() OVER() AS num_row,
  code, 
  name
FROM furniture;

Frågan returnerar radnumret för varje möbel tillsammans med dess namn och kod:

num_rad namn kod
1 säng 101
2 soffa 202
3 stol 333
4 bokhylla 123
5 tabell 235
6 skrivbord 766

Observera att namnen på möbeln inte är sorterade.

Diskussion:

Om du vill numrera varje rad i en resultatuppsättning tillhandahåller SQL ROW_NUMBER() fungera. Denna funktion används i en SELECT klausul med andra kolumner. Efter ROW_NUMBER() sats kallar vi OVER() fungera. Om du skickar in några argument till OVER , kommer numreringen av rader inte att sorteras efter någon kolumn. Följaktligen kommer ordningen på de visade raderna att vara icke-deterministisk; i de flesta fall är det den ordning i vilken posterna infogades i tabellen. Numreringen av rader börjar vid 1. I vårt exempel har varje post ett nummer från 1 till 6.

Vi kan också tilldela radnummer med hjälp av en kolumn. I exemplet nedan numrerar vi poster sorterade efter namn. Vi gör detta genom att skicka in det argumentet till OVER tillsammans med ORDER BY (den sorterar poster enligt namnkolumnen):

SELECT ROW_NUMBER() OVER(ORDER BY name) AS num_row,
  name, 
  code
FROM furniture;

När du tittar på resultatuppsättningen ser du de sorterade raderna med deras nummer:

rad namn kod
1 säng 101
2 bokhylla 123
3 stol 333
4 skrivbord 766
5 soffa 202
6 tabell 235

Numreringen tillhandahålls av ROW_NUMBER() är oberoende av ordningen på raderna i resultattabellen. I exemplet nedan numrerar vi poster med det sorterade kolumnnamnet (OVER(ORDER BY name) ), men vi visar poster i resultatuppsättningen enligt en annan kolumn (i vårt exempel, ORDER BY code ).

SELECT ROW_NUMBER() OVER(ORDER BY name) AS num_row,
  name, 
  code
FROM furniture
ORDER BY code;

Frågan returnerade numret på varje rad, men dessa nummer är inte i stigande ordning, eftersom poster sorteras enligt kolumnkod:

rad namn kod
1 säng 101
2 bokhylla 123
5 soffa 202
6 tabell 235
3 stol 333
4 skrivbord 766

Standardordningen för de sorterade raderna är stigande, men du kan också sortera i fallande ordning med DESC nyckelord efter namnet på den kolumn som du vill sortera efter:

SELECT ROW_NUMBER() OVER(ORDER BY name ASC) AS num_row,
  name, 
  code
FROM furniture
ORDER BY code DESC;

Frågan ovan returnerade resultatuppsättningen:

rad namn kod
4 skrivbord 766
3 stol 333
6 tabell 235
5 soffa 202
2 bokhylla 123
1 säng 101

  1. Hur deklarerar och använder jag variabler i PL/SQL som jag gör i T-SQL?

  2. Hur får man tillgång till Oracle-databasen över nätverket?

  3. PostgreSQL Multi-Cloud Cluster Distribution

  4. Lagrad procedur som exporterar data till csv-filer exporterar endast till en fil