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 |