Published on

February 28, 2012

Comprendre les fonctions de classement de SQL Server

SQL Server propose plusieurs fonctions de classement qui peuvent être utilisées pour classer les lignes d’un ensemble de résultats sur une partition. Ces fonctions incluent ROW_NUMBER, RANK, DENSE_RANK et NTILE. Dans cet article, nous explorerons ces fonctions de classement et fournirons des exemples de leur utilisation.

ROW_NUMBER

La fonction ROW_NUMBER est la plus simple des fonctions de classement. Elle attribue un numéro consécutif à chaque ligne de l’ensemble de résultats en fonction de l’ordre spécifié dans la clause OVER. Si une partition est spécifiée, la numérotation recommence pour chaque partition. Voici un exemple :

SELECT ProductID, SUM(OrderQty) AS ProductOrderCount, ROW_NUMBER() OVER (ORDER BY SUM(OrderQty) DESC) AS Row
FROM Sales.SalesOrderDetail
WHERE OrderDate BETWEEN '1/1/2008' AND '12/31/2008'
GROUP BY ProductID
ORDER BY Row

Cette requête récupère les 10 produits les plus vendus en 2008 et attribue un numéro de ligne en fonction de l’ordre de la somme des quantités commandées. L’ensemble de résultats inclura l’ID du produit, la quantité totale commandée et le numéro de ligne.

RANK

La fonction RANK attribue un rang à chaque ligne de l’ensemble de résultats. En cas d’égalité, les lignes égalées recevront le même rang et le rang suivant sera sauté. Voici un exemple :

SELECT ProductID, SUM(OrderQty) AS ProductOrderCount, RANK() OVER (ORDER BY SUM(OrderQty) DESC) AS Ranking
FROM Sales.SalesOrderDetail
WHERE OrderDate BETWEEN '1/1/2008' AND '12/31/2008'
GROUP BY ProductID
HAVING SUM(OrderQty) BETWEEN 400 AND 500
ORDER BY Ranking

Dans cet exemple, la requête récupère les produits avec une quantité totale de commande comprise entre 400 et 500 et attribue un rang en fonction de l’ordre de la somme des quantités commandées. En cas d’égalité, les lignes égalées recevront le même rang et le rang suivant sera sauté.

DENSE_RANK

La fonction DENSE_RANK est similaire à la fonction RANK, mais elle ne saute pas les rangs pour les lignes égalées. Chaque ligne égalée recevra le même rang et le rang suivant sera attribué en conséquence. Voici un exemple :

SELECT ProductID, SUM(OrderQty) AS ProductOrderCount, DENSE_RANK() OVER (ORDER BY SUM(OrderQty) DESC) AS Ranking
FROM Sales.SalesOrderDetail
WHERE OrderDate BETWEEN '1/1/2008' AND '12/31/2008'
GROUP BY ProductID
HAVING SUM(OrderQty) BETWEEN 400 AND 500
ORDER BY Ranking

Dans cet exemple, la requête récupère les produits avec une quantité totale de commande comprise entre 400 et 500 et attribue un rang dense en fonction de l’ordre de la somme des quantités commandées. Chaque ligne égalée recevra le même rang et le rang suivant sera attribué en conséquence.

NTILE

La fonction NTILE est utilisée pour diviser les lignes également en un nombre spécifié de groupes. Si le nombre de lignes n’est pas divisible de manière égale par le nombre de groupes, certains groupes peuvent avoir une ligne de plus que les autres. Voici un exemple :

SELECT ProductID, SUM(OrderQty) AS ProductOrderCount, NTILE(4) OVER (ORDER BY SUM(OrderQty) DESC) AS Ranking
FROM Sales.SalesOrderDetail
WHERE OrderDate BETWEEN '1/1/2008' AND '12/31/2008'
GROUP BY ProductID
HAVING SUM(OrderQty) BETWEEN 400 AND 500
ORDER BY Ranking

Dans cet exemple, la requête récupère les produits avec une quantité totale de commande comprise entre 400 et 500 et les divise en 4 groupes en fonction de l’ordre de la somme des quantités commandées. Les groupes avec des lignes supplémentaires seront classés en premier.

Conclusion

SQL Server propose des fonctions de classement puissantes qui peuvent être utilisées pour classer et regrouper des ensembles de résultats. Les fonctions ROW_NUMBER, RANK, DENSE_RANK et NTILE offrent différentes façons d’attribuer des rangs et de diviser les lignes en groupes. Comprendre ces fonctions peut vous aider à analyser et à manipuler vos données de manière efficace.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.