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 |