DENSE_RANK (Transact-SQL)
Restituisce il rango delle righe nella partizione di un set dei risultati, senza vuoti tra i ranghi. Il rango di una riga corrisponde a 1 più il numero di ranghi distinti che precedono la riga in questione.
Convenzioni della sintassi Transact-SQL
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 della funzione DENSE_RANK alle righe in una partizione.
Tipi restituiti
bigint
Osservazioni
Se due o più righe hanno un valore equivalente per un rango nella stessa partizione, alle righe con valori equivalenti viene assegnato lo stesso rango. Ad esempio, se due venditori principali hanno lo stesso valore SalesYTD, a entrambi viene assegnato il rango uno. Al venditore con il valore SalesYTD più elevato successivo 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
A.Classificazione di righe all'interno di una partizione
Nell'esempio seguente vengono assegnati i ranghi per i prodotti nelle ubicazioni di inventario specificate in base alle quantità. Il set di risultati viene partizionato da LocationID e ordinato logicamente in base al valore di Quantity. Si noti che la quantità dei prodotti 494 e 495 è la stessa. Poiché tali prodotti sono collegati, vengono entrambi classificati con uno.
USE AdventureWorks2012;
GO
SELECT i.ProductID, p.Name, i.LocationID, i.Quantity
,DENSE_RANK() OVER
(PARTITION BY i.LocationID ORDER BY i.Quantity DESC) AS Rank
FROM Production.ProductInventory AS i
INNER JOIN Production.Product AS p
ON i.ProductID = p.ProductID
WHERE i.LocationID BETWEEN 3 AND 4
ORDER BY i.LocationID;
GO
Set di risultati:
ProductID Name LocationID Quantity Rank
----------- ---------------------------------- ---------- -------- -----
494 Paint - Silver 3 49 1
495 Paint - Blue 3 49 1
493 Paint - Red 3 41 2
496 Paint - Yellow 3 30 3
492 Paint - Black 3 17 4
495 Paint - Blue 4 35 1
496 Paint - Yellow 4 25 2
493 Paint - Red 4 24 3
492 Paint - Black 4 14 4
494 Paint - Silver 4 12 5
(10 row(s) affected)
B.Classificazione di tutte le righe in un set di risultati
Nell'esempio seguente vengono restituiti i primi dieci dipendenti classificati in base allo stipendio. Poiché non è specificata alcuna clausola PARTITION BY, la funzione DENSE_RANK è stata applicata a tutte le righe nel set di risultati.
USE AdventureWorks2012;
GO
SELECT TOP(10) BusinessEntityID, Rate,
DENSE_RANK() OVER (ORDER BY Rate DESC) AS RankBySalary
FROM HumanResources.EmployeePayHistory;
Set di risultati:
BusinessEntityID Rate RankBySalary
---------------- --------------------- --------------------
1 125.50 1
25 84.1346 2
273 72.1154 3
2 63.4615 4
234 60.0962 5
263 50.4808 6
7 50.4808 6
234 48.5577 7
285 48.101 8
274 48.101 8