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 |