ROW_NUMBER
Descrizione
ROW_NUMBER
è una funzione di aggregazione della finestra che suddivide le righe in gruppi, ordina le righe in base a un campo e assegna un numero sequenziale univoco a ogni riga di un gruppo, a partire da 1 per la prima riga di ogni gruppo. ROW_NUMBER
assegna sempre un valore univoco a ogni riga di un gruppo. È possibile utilizzare ROW_NUMBER
per creare un ID univoco per ogni riga del set di dati.Il
PARTITION BY
La clausola determina i campi da utilizzare per suddividere un insieme di righe di input in gruppi.Il
ORDER BY
La clausola determina come ordinare le righe nella partizione prima che venga assegnato loro un numero progressivo. Il sistema separa le righe di input in gruppi in base ai campi di partizionamento, ordina le righe in base ai campi di ordinamento e quindi calcola l'espressione aggregata (numerazione delle righe per questa funzione) in ogni gruppo. Le righe numerate in ogni gruppo iniziano da 1.
Sintassi
ROW_NUMBER()OVER(PARTITION BYpartitioning_field[,partitioning_field]ORDER BYordering_field[ASC | DESC] [,ordering_field[ASC | DESC]] )
Valore restituito
Restituisce un valore di tipo
INTEGER
.Parametri di input
- OVER()
- ObbligatorioOVERdeve essere utilizzato all'interno di aROW_NUMBERespressione
- PARTITION BYpartitioning_field
- Sono obbligatori. Utilizzare ilPARTITION BYper specificare uno o più campi da utilizzare per partizionare un gruppo di righe di input. È possibile specificare qualsiasi tipo di campo tranne Valuta. Esempio: si specifica il campo Mese come campo di partizionamento, in modo che il sistema raggruppa in un'unica partizione tutti i record che hanno lo stesso valore per il mese.
- ORDER BYordering_field
- Sono obbligatori. Utilizzare ilORDER BYper specificare come ordinare le righe di input nella partizione utilizzando i valori nel campo specificato all'interno di ogni partizione. È possibile specificare qualsiasi tipo di campo tranne Valuta.È possibile utilizzareDESCoASCper ordinare le parole chiave in ordine decrescente (valori da decrescente, valori NULL ultimi) o crescente (valori decrescenti, valori NULL primi) per ogni campo di ordinamento. Se non si specifica un ordinamento per un campo di ordinamento, il sistema ordina automaticamente le righe in ordine crescente.
Esempi
Esempio: si dispone di un set di dati con queste righe e questi campi.
Dipendente | Data vendita | Vendite |
|---|---|---|
Ehi | 12/31/2018 | 140 |
Ehi | 11/30/2018 | 60 |
Ehi | 10/31/2018 | 140 |
Freeman | 12/31/2018 | 160 |
Freeman | 11/30/2018 | 60 |
Freeman | 10/31/2018 | 110 |
Smith | 12/31/2018 | 140 |
Smith | 11/30/2018 | 60 |
Smith | 10/31/2018 | 120 |
È possibile assegnare un ID univoco alle vendite di ogni dipendente in ordine decrescente, in modo che alle vendite più alte venga assegnato il ranking 1. Utilizzare questa espressione nel campo
N. vendite per dipendente
:ROW_NUMBER() OVER( PARTITION BY [Employee] ORDER BY [Sales] DESC)
Si ottengono i seguenti risultati:
Dipendente | Data vendita | Vendite | N. vendite per dipendente |
|---|---|---|---|
Ehi | 12/31/2018 | 140 | 1 |
Ehi | 10/31/2018 | 140 | 2 |
Ehi | 11/30/2018 | 60 | 3 |
Freeman | 12/31/2018 | 160 | 1 |
Freeman | 10/31/2018 | 110 | 2 |
Freeman | 11/30/2018 | 60 | 3 |
Smith | 12/31/2018 | 140 | 1 |
Smith | 10/31/2018 | 120 | 2 |
Smith | 11/30/2018 | 60 | 3 |
È anche possibile assegnare un ID univoco alle vendite per ogni data in ordine decrescente, in modo che alle vendite più alte venga assegnato il ranking 1. Utilizzare questa espressione nel campo
N. vendite per data
:ROW_NUMBER() OVER( PARTITION BY [Sales Date] ORDER BY [Sales] DESC)
Si ottengono i seguenti risultati:
Dipendente | Data vendita | Vendite | N. vendite per data |
|---|---|---|---|
Freeman | 12/31/2018 | 160 | 1 |
Ehi | 12/31/2018 | 140 | 2 |
Smith | 12/31/2018 | 140 | 3 |
Ehi | 11/30/2018 | 60 | 1 |
Freeman | 11/30/2018 | 60 | 2 |
Smith | 11/30/2018 | 60 | 3 |
Ehi | 10/31/2018 | 140 | 1 |
Smith | 10/31/2018 | 120 | 2 |
Freeman | 10/31/2018 | 110 | 3 |
È anche possibile utilizzare
ROW_NUMBER
per determinare la versione più recente di ogni riga in un set di dati che contiene più righe per ID. In questo scenario, il set di dati richiede un campo data che rappresenti il momento in cui le informazioni in quella riga sono diventate aggiornate. Se si ha familiarità con i concetti di data warehousing, questa è una tabella dimensionale di tipo 2 che cambia lentamente. Si dispone di un set di dati con queste righe e questi campi.ID | Nome | Area geografica | Decorrenza |
|---|---|---|---|
G1 | Gorman | Ovest | 01/01/2015 |
H1 | Harris | Ovest | 01/01/2015 |
G1 | Gorman | Est | 09/01/2016 |
H1 | Harris | Est | 01/03/2017 |
H1 | Harris | Nazionale | 01/20/2021 |
Per assegnare il valore 1 alla versione più recente di ogni ID, utilizzare questa espressione nel campo
Ultima versione
:ROW_NUMBER() OVER( PARTITION BY [ID] ORDER BY [Effective Date] DESC)
Si ottengono i seguenti risultati:
ID | Nome | Area geografica | Decorrenza | Ultima versione |
|---|---|---|---|---|
G1 | Gorman | Ovest | 01/01/2015 | 2 |
H1 | Harris | Ovest | 01/01/2015 | 3 |
G1 | Gorman | Est | 09/01/2016 | 1 |
H1 | Harris | Est | 01/03/2017 | 2 |
H1 | Harris | Nazionale | 01/20/2021 | 1 |
È possibile filtrare in base alla
versione più recente
utilizzando una fase filtro per restituire solo la riga più recente per ogni ID.