Problema:
Si desidera assegnare a ciascuna riga della tabella dei risultati un numero separato.
Esempio:
Il nostro database ha una tabella denominata furniture con i dati nelle seguenti colonne:code (chiave primaria) e name .
| codice | |
|---|---|
| 101 | letto |
| 202 | divano |
| 333 | sedia |
| 123 | libreria |
| 235 | tabella |
| 766 | scrivania |
I furniture Il tavolo memorizza il nome dei mobili che vogliamo numerare.
Soluzione:
SELECT ROW_NUMBER() OVER() AS num_row, code, name FROM furniture;
La query restituisce il numero di riga di ogni mobile insieme al nome e al codice:
| num_row | codice | |
|---|---|---|
| 1 | letto | 101 |
| 2 | divano | 202 |
| 3 | sedia | 333 |
| 4 | libreria | 123 |
| 5 | tabella | 235 |
| 6 | scrivania | 766 |
Nota che i nomi dei mobili non sono ordinati.
Discussione:
Se desideri numerare ogni riga in un set di risultati, SQL fornisce il ROW_NUMBER() funzione. Questa funzione viene utilizzata in un SELECT clausola con altre colonne. Dopo il ROW_NUMBER() clausola, chiamiamo OVER() funzione. Se passi qualsiasi argomento a OVER , la numerazione delle righe non verrà ordinata in base ad alcuna colonna. Pertanto, l'ordine delle righe visualizzate non sarà deterministico; nella maggior parte dei casi, è l'ordine in cui i record sono stati inseriti nella tabella. La numerazione delle righe inizia da 1. Nel nostro esempio, ogni record ha un numero da 1 a 6.
Possiamo anche assegnare numeri di riga usando una colonna. Nell'esempio seguente, numeriamo i record ordinati per nome. Lo facciamo passando quell'argomento a OVER insieme a ORDER BY (ordina i record in base alla colonna del nome):
SELECT ROW_NUMBER() OVER(ORDER BY name) AS num_row, name, code FROM furniture;
Mentre guardi il set di risultati, vedi le righe ordinate con i loro numeri:
| riga | codice | |
|---|---|---|
| 1 | letto | 101 |
| 2 | libreria | 123 |
| 3 | sedia | 333 |
| 4 | scrivania | 766 |
| 5 | divano | 202 |
| 6 | tabella | 235 |
La numerazione fornita da ROW_NUMBER() è indipendente dall'ordine delle righe nella tabella dei risultati. Nell'esempio seguente, numeriamo i record utilizzando il nome della colonna ordinata (OVER(ORDER BY name) ), ma visualizziamo i record nel set di risultati in base a un'altra colonna (nel nostro esempio, ORDER BY code ).
SELECT ROW_NUMBER() OVER(ORDER BY name) AS num_row, name, code FROM furniture ORDER BY code;
La query ha restituito il numero di ogni riga, ma questi numeri non sono in ordine crescente, perché i record sono ordinati in base al codice della colonna:
| riga | codice | |
|---|---|---|
| 1 | letto | 101 |
| 2 | libreria | 123 |
| 5 | divano | 202 |
| 6 | tabella | 235 |
| 3 | sedia | 333 |
| 4 | scrivania | 766 |
L'ordine predefinito delle righe ordinate è crescente, ma puoi anche ordinare in ordine decrescente usando il DESC parola chiave dopo il nome della colonna in base alla quale si desidera ordinare:
SELECT ROW_NUMBER() OVER(ORDER BY name ASC) AS num_row, name, code FROM furniture ORDER BY code DESC;
La query sopra ha restituito il set di risultati:
| riga | codice | |
|---|---|---|
| 4 | scrivania | 766 |
| 3 | sedia | 333 |
| 6 | tabella | 235 |
| 5 | divano | 202 |
| 2 | libreria | 123 |
| 1 | letto | 101 |