DENSE_RANK (Transact-SQL)
Restituisce il rango delle righe nella partizione di un set dei risultati, senza gap nell'assegnazione dei ranghi. Il rango di una riga corrisponde a 1 più il numero di ranghi distinti che precedono la riga in questione.
Sintassi
DENSE_RANK ( ) OVER ( [ <partition_by_clause> ] < order_by_clause > )
Argomenti
<partition_by_clause>
Suddivide il set di risultati generato dalla clausola FROM in partizioni alle quali viene applicata la funzione DENSE_RANK. Per la sintassi PARTITION BY, vedere Clausola OVER (Transact-SQL).<order_by_clause>
Determina l'ordine di applicazione dei valori DENSE_RANK alle righe in una partizione. Una colonna non può essere rappresentata da un valore integer nell'argomento <order_by_clause> utilizzato in una funzione di rango.
Tipi restituiti
bigint
Osservazioni
Se due o più righe hanno un valore equivalente per l'assegnazione del rango nella stessa partizione, a ogni riga viene assegnato lo stesso rango. Ad esempio, se sono presenti due venditori che hanno raggiunto i risultati di vendita maggiori con lo stesso valore SalesYTD, a entrambi verrà assegnato il rango 1. Al venditore con il valore successivo SalesYTD più alto verrà assegnato il rango 2. Tale valore di rango corrisponde a 1 più il numero di righe distinte che precedono questa riga. I numeri restituiti dalla funzione DENSE_RANK sono pertanto sempre consecutivi e senza gap.
L'ordinamento utilizzato per l'intera query determina l'ordine di visualizzazione delle righe nel risultato. Ciò significa che una riga con numero di rango 1 non sarà necessariamente la prima riga nella partizione.
Esempi
Nell'esempio seguente viene restituito il valore DENSE_RANK della quantità di prodotti nelle varie posizioni. Si noti che ORDER BY nella clausola OVER ordina DENSE_RANK e che ORDER BY dell'istruzione SELECT ordina il set di risultati.
USE AdventureWorks2008R2;
GO
SELECT i.ProductID, p.Name, i.LocationID, i.Quantity,
DENSE_RANK() OVER (PARTITION BY i.LocationID ORDER BY i.Quantity) AS DENSE_RANK
FROM Production.ProductInventory i
INNER JOIN Production.Product p
ON i.ProductID = p.ProductID
ORDER BY Name;
GO