Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier les répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer de répertoire.
S’applique à :SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Point de terminaison d’analytique SQL dans Microsoft Fabric
Entrepôt dans Microsoft Fabric
Base de données SQL dans 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.
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 lorsque la requête est exécutée. Pour faire persister les nombres dans une table, voir IDENTITY (Property) et CREATE SEQUENCE.
Conventions de la syntaxe Transact-SQL
Syntaxe
RANK ( ) OVER ( [ partition_by_clause ] order_by_clause )
Arguments
TERMINÉ ( [ partition_by_clause ] order_by_clause )
Le partition_by_clause divise l’ensemble de résultats produit par la FROM clause 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.
Le order_by_clause détermine l’ordre des données avant que la fonction ne soit appliquée.
order_by_clause est requis. Le <rows or range clause> de la OVER clause ne peut pas être spécifié pour la RANK fonction. Pour plus d’informations, consultez la clause SELECT - OVER.
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 commerciaux ont la même SalesYTD valeur, ils sont tous deux classés un. Le vendeur avec le prochain meilleur SalesYTD classement est classé troisième, car il y a deux rangées qui sont mieux classées. Par conséquent, la RANK fonction 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
Les exemples de code de cet article utilisent les bases de données d'exemple AdventureWorks2025 ou AdventureWorksDW2025, que vous pouvez télécharger à partir de la page d'accueil Microsoft SQL Server Samples and Community Projects.
R. Rangs de rang au sein 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. À l’emplacement 3, les produits 494 et 495 ont la même quantité. Parce qu’ils sont à égalité, ils sont tous les deux classés un.
USE AdventureWorks2025;
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;
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
B. Classez toutes les lignes d’un ensemble de résultats
L’exemple suivant restitue les 10 meilleurs employés classés selon leur salaire. Comme une PARTITION BY clause n’est pas spécifiée, la RANK fonction est appliquée à toutes les lignes de l’ensemble des résultats.
USE AdventureWorks2025;
GO
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 e.LastName,
st.SalesTerritoryGroup,
SUM(sq.SalesAmountQuota) AS TotalSales,
RANK() OVER (PARTITION BY st.SalesTerritoryGroup ORDER BY SUM(sq.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 e.SalesPersonFlag = 1
AND st.SalesTerritoryGroup <> N'NA'
GROUP BY e.LastName, st.SalesTerritoryGroup;
Voici le jeu de résultats.
LastName SalesTerritoryGroup TotalSales RankResult
------------------ -------------------- ------------ -----------
Pak Europe 10514000.00 1
Varkey Chudukatil Europe 5557000.00 2
Valdez Europe 2287000.00 3
Carson North America 12198000.00 1
Mitchell North America 11786000.00 2
Blythe North America 11162000.00 3
Reiter North America 8541000.00 4
Ito North America 7804000.00 5
Saraiva North America 7098000.00 6
Vargas North America 4365000.00 7
Campbell North America 4025000.00 8
Ansman-Wolfe North America 3551000.00 9
Mensa-Annan North America 2753000.00 10
Tsoflias Pacific 1687000.00 1