Di: Koen Verbeeck
Panoramica
L’argomento di questa parte riguarda le funzioni di classificazione. Sono stati introdotti in SqlServer 2005. ROW_NUMBER è anche una funzione di classifica, ma è già stato coveredextensively nella parte precedente di questo tutorial.
RANK e DENSE_RANK
In contrasto con la funzione ROW_NUMBER,RANK andDENSE_RANK non devono generare numeri univoci. La differenza tra tutte queste funzioni è il modo in cui gestiscono i legami.,
- ROW_NUMBER genererà sempre valori univoci senza spazi vuoti, anche se ci sono legami.
- RANGO può avere lacune nella sua sequenza e quando i valori sono gli stessi, ottengono lo stesso rango.
- DENSE_RANK restituisce anche lo stesso rank per i legami, ma non ha anygaps nella sequenza.
Illustriamo con un esempio., Supponiamo di avere la seguente samplevalues:
![](https://www.mssqltips.com/images_tutorials/9126_ranking-functions.001.png)
Possiamo scrivere la seguente query per verificare le tre funzioni di classificazione:
Questo ci dà questo risultato set:
![](https://www.mssqltips.com/images_tutorials/9126_ranking-functions.002.png)
Come si può vedere, il RANK restituirà lo stesso rango per i legami. Tuttavia, il prossimo rankin gruppo A è il numero 3, omettendo rango 2. DENSE_RANK d’altra parte non skip rank 2. Quando non ci sono legami nel set di record, tutte e tre le funzioni di graduazioneritornare lo stesso risultato esatto.,
Con ROW_NUMBER e RANK, possiamo creare un costrutto alternativo per rilevare duplicaterows. Con gli stessi dati di esempio utilizzati nella parte 5 di questo tutorial, possiamo creare la seguente query per trovare tutte le righe che hanno una chiave aziendale duplicata:
Il set di risultati:
![](https://www.mssqltips.com/images_tutorials/9126_ranking-functions.003.png)
Ora abbiamo solo bisogno di filtrare i record in cui il numero di riga generato (RID) è diverso dal rank (RankID). Questo restituirà un record per Bob, quindi sappiamo che c’è un record duplicato per quel dipendente.
Quando usare RANK o DENSE_RANK?,
Come specificato prima, RANK può avere lacune nella sequenza e DENSE_RANK no.Supponiamo che tu abbia il compito di trovare i primi 5 clienti in base al valore delle vendite.Con RANK, puoi classificare i tuoi clienti e quindi filtrare eventuali clienti con arank più grande di 5. Se faresti lo stesso con DENSE_RANK, potresti finire con più di 6 clienti!,
Supponiamo di avere questo insieme di informazioni relative ai nostri clienti:
![](https://www.mssqltips.com/images_tutorials/9126_ranking-functions.004.png)
Quando si aggiungono i ranghi con RANGO e DENSE_RANK, abbiamo i seguenti dati:
![](https://www.mssqltips.com/images_tutorials/9126_ranking-functions.005.png)
Quando il filtro su rank <= 5, si otterrà esattamente 5 righe restituite. Tuttavia, se si filtra su denserank < = 5, si otterranno 6 righe, che potrebbero non essere ciò che si desidera. Più legami, più righe DENSE_RANK possono tornare. Se il legame wouldbe esattamente il numero di riga 5, la funzione di rango sarebbe anche restituire 6 righe., In questocaso, è necessario “rompere la cravatta”. Puoi farlo usando ROW_NUMBERfunction o ordinando sulla colonna aggiuntiva.
NTILE
L’ultima funzione di classifica è un po ‘ speciale. NTILE divide le file in secchielli di dimensioni approssimative. Supponiamo di avere 20 righe e di specificare NTILE (2). Questo ti darà 2 secchi con 10 righe ciascuno. Quando si utilizza NTILE (3), si ottengono 2 secchi con7 righe e 1 secchio con 6 righe.,
Riutilizziamo la query dalla sezione precedente, ma aggiungiamo un’espressioneutilizzando NTILE:
Otteniamo i seguenti risultati:
![](https://www.mssqltips.com/images_tutorials/9126_ranking-functions.006.png)
Un esempio in cui NTILE è stato utilizzato per dividere i dati in bucket è descritto nelcome creare un grafico heat map in SQL Server Reporting Services 2016.,
Ulteriori Informazioni
- Ulteriori suggerimenti circa le funzioni di classificazione:
- SQL Server 2005 e 2008 le Funzioni di Classificazione DENSE_RANK e NTILE
- SQL Server 2005 e 2008 le Funzioni di Classificazione Row_Number e Rango
- Dimenticato le Funzioni di SQL Server – VARP, SOUNDEX e NTILE
Ultimo Aggiornamento: 5/31/2018