Funzioni della finestra di SQL Server RANK, DENSE_RANK e NTILE


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:

Possiamo scrivere la seguente query per verificare le tre funzioni di classificazione:

Questo ci dà questo risultato set:

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:

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:

Quando si aggiungono i ranghi con RANGO e DENSE_RANK, abbiamo i seguenti dati:

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:

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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *