Partager via


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.

Icône Lien de rubrique 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

Voir aussi

Référence

RANK (Transact-SQL)

ROW_NUMBER (Transact-SQL)

NTILE (Transact-SQL)

Fonctions de classement (Transact-SQL)

Fonctions intégrées (Transact-SQL)