RANK (Transact-SQL)
S’applique à : SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) SQL analytics endpoint in Microsoft Fabric Warehouse in Microsoft Fabric
Retourne le rang de chaque ligne au sein de la partition d'un jeu de résultats. Le rang d'une ligne est un, plus le nombre de rangs précédant la ligne en question.
Les fonctions ROW_NUMBER et RANK sont similaires. ROW_NUMBER numérote toutes les lignes dans l’ordre (par exemple 1, 2, 3, 4, 5). RANK fournit la même valeur numérique pour les liens (par exemple 1, 2, 2, 4, 5).
Notes
RANK est une valeur temporaire calculée quand la requête est exécutée. Pour conserver les nombres dans un tableau, consultez IDENTITY (propriété) et SEQUENCE.
Conventions de la syntaxe Transact-SQL
Syntaxe
RANK ( ) OVER ( [ partition_by_clause ] order_by_clause )
Arguments
OVER ( [ partition_by_clause ] order_by_clause)
partition_by_clause divise le jeu de résultats généré par la clause FROM en partitions auxquelles la fonction est appliquée. S'il n'est pas spécifié, la fonction gère toutes les lignes du jeu de résultats de la requête en un seul groupe. order_by_clause détermine l’ordre des données avant que la fonction soit appliquée. order_by_clause est requis. La <clause ROWS ou RANGE/> de la clause OVER ne peut pas être spécifiée pour la fonction RANK. Pour plus d’informations, consultez Clause OVER (Transact-SQL).
Types de retour
bigint
Notes
Si plusieurs lignes sont à égalité pour un rang, elles reçoivent le même rang. Par exemple, si les deux meilleurs vendeurs ont la même valeur SalesYTD, leur rang à tous deux est un. Le rang du vendeur qui suit dans la hiérarchie SalesYTD est trois, car il existe deux lignes au rang supérieur. Par conséquent, la fonction RANK ne retourne pas toujours des entiers consécutifs.
L'ordre de tri utilisé pour toute la requête détermine l'ordre d'apparition des lignes dans un jeu de résultats.
RANK n'est pas déterministe. Pour plus d’informations, consultez Fonctions déterministes et non déterministes.
Exemples
R. 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 AdventureWorks2022;
GO
SELECT i.ProductID, p.Name, i.LocationID, i.Quantity
,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 le jeu de 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 AdventureWorks2022
SELECT TOP(10) BusinessEntityID, Rate,
RANK() OVER (ORDER BY Rate DESC) AS RankBySalary
FROM HumanResources.EmployeePayHistory AS eph1
WHERE RateChangeDate = (SELECT MAX(RateChangeDate)
FROM HumanResources.EmployeePayHistory AS eph2
WHERE eph1.BusinessEntityID = eph2.BusinessEntityID)
ORDER BY BusinessEntityID;
Voici le jeu de résultats.
BusinessEntityID Rate RankBySalary
---------------- --------------------- --------------------
1 125.50 1
2 63.4615 4
3 43.2692 11
4 29.8462 28
5 32.6923 22
6 32.6923 22
7 50.4808 6
8 40.8654 14
9 40.8654 14
10 42.4808 13
Exemples : Azure Synapse Analytics et Analytics Platform System (PDW)
C : Classement des lignes d'une partition
L’exemple suivant classe par rang les représentants commerciaux dans chaque secteur de vente en fonction de leurs ventes totales. L'ensemble de lignes est partitionné par SalesTerritoryGroup
et trié par SalesAmountQuota
.
-- Uses AdventureWorks
SELECT LastName, SUM(SalesAmountQuota) AS TotalSales, SalesTerritoryRegion,
RANK() OVER (PARTITION BY SalesTerritoryRegion ORDER BY SUM(SalesAmountQuota) DESC ) AS RankResult
FROM dbo.DimEmployee AS e
INNER JOIN dbo.FactSalesQuota AS sq ON e.EmployeeKey = sq.EmployeeKey
INNER JOIN dbo.DimSalesTerritory AS st ON e.SalesTerritoryKey = st.SalesTerritoryKey
WHERE SalesPersonFlag = 1 AND SalesTerritoryRegion != N'NA'
GROUP BY LastName, SalesTerritoryRegion;
Voici le jeu de résultats.
LastName TotalSales SalesTerritoryRegion RankResult
---------------- ------------- ------------------- --------
Tsoflias 1687000.0000 Australia 1
Saraiva 7098000.0000 Canada 1
Vargas 4365000.0000 Canada 2
Carson 12198000.0000 Central 1
Varkey Chudukatil 5557000.0000 France 1
Valdez 2287000.0000 Germany 1
Blythe 11162000.0000 Northeast 1
Campbell 4025000.0000 Northwest 1
Ansman-Wolfe 3551000.0000 Northwest 2
Mensa-Annan 2753000.0000 Northwest 3
Reiter 8541000.0000 Southeast 1
Mitchell 11786000.0000 Southwest 1
Ito 7804000.0000 Southwest 2
Pak 10514000.0000 United Kingdom 1
Voir aussi
DENSE_RANK (Transact-SQL)
ROW_NUMBER (Transact-SQL)
NTILE (Transact-SQL)
Fonctions de classement (Transact-SQL)
Fonctions intégrées (Transact-SQL)