DENSE_RANK (Transact-SQL)
Retourne le rang des lignes à l'intérieur de la partition d'un jeu de résultats, sans aucun vide dans le classement. Le rang d'une ligne est égal à un plus le nombre de rangs distincts précédant la ligne en question.
Conventions de la syntaxe Transact-SQL
Syntaxe
DENSE_RANK ( ) OVER ( [ <partition_by_clause> ] < order_by_clause > )
Arguments
<partition_by_clause>
Divise le jeu de résultats généré par la clause FROM en partitions auxquelles la fonction DENSE_RANK est appliquée. Pour connaître la syntaxe de PARTITION BY, consultez Clause OVER (Transact-SQL).<order_by_clause>
Détermine l'ordre dans lequel la fonction DENSE_RANK est appliquée aux lignes dans une partition.
Type des valeurs retournées
bigint
Notes
Si au moins deux lignes sont liées à un rang de la même partition, elles reçoivent le même rang. Par exemple, si les deux meilleurs commerciaux ont la même valeur SalesYTD, leur rang à tous deux est un. Le commercial dont la valeur SalesYTD est immédiatement inférieure reçoit le rang deux. Cela correspond à un rang de plus que le nombre de lignes distinctes précédant cette ligne. Par conséquent, les nombres retournés par la fonction DENSE_RANK ne comportent pas de vides et définissent toujours des rangs consécutifs.
L'ordre de tri utilisé pour l'ensemble de la requête détermine l'ordre d'apparition des lignes dans un résultat. Cela implique qu'une ligne ayant le rang numéro un n'est pas nécessairement la première ligne de la partition.
Exemples
A.Classement des lignes d'une partition
L'exemple suivant classe les produits d'inventaire aux emplacements d'inventaire suivants en fonction de leurs quantités. Le jeu de résultats est partitionné par LocationID et classé logiquement par Quantity. Notez que les produits 494 et 495 ont la même quantité. Étant liés, ils sont tous deux classés numéro un.
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
Voici l'ensemble des résultats.
ProductID Name LocationID Quantity Rank
----------- ---------------------- ------------ -------- ----
494 Paint - Silver 3 49 1
495 Paint - Blue 3 49 1
493 Paint - Red 3 41 3
496 Paint - Yellow 3 30 4
492 Paint - Black 3 17 5
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.Classement de toutes les lignes dans un jeu de résultats
L'exemple suivant retourne les dix principaux employés classés en fonction de leur salaire. Étant donné qu'aucune clause PARTITION BY n'a été spécifiée, la fonction RANK a été appliquée à toutes les lignes du jeu de résultats.
USE AdventureWorks2012
SELECT TOP(10) BusinessEntityID, Rate,
DENSE_RANK() OVER (ORDER BY Rate DESC) AS RankBySalary
FROM HumanResources.EmployeePayHistory;
Voici l'ensemble des résultats.
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 8
285 48.101 9
274 48.101 9