Database
 sql >> Database >  >> RDS >> Database

Come numerare le righe in SQL

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