Classements

SyntaxeProjection de classement

1
SELECT RANK() OVER (PARTITION BY a ORDER BY b DESC), ...
2
 FROM ...
3
GROUP BY a ...

RANK() OVER (PARTITION BY a ORDER BY b DESC) permet de projeter le classement de l'enregistrement par rapport au critère "b" (qui peut être un agrégat), partitionné par le critère "a".

PARTITION BY est optionnel.

On notera que l'attribut de partitionnement du classement "a" est forcément un attribut de regroupement, il doit donc être déclaré dans le GROUP BY.

Exemple

1
SELECT * FROM
2
(
3
SELECT p.titre AS titre, count(*) AS ventes, RANK() OVER (ORDER BY count(*) DESC) AS rank
4
FROM ventes v, produit p
5
WHERE p.isbn=v.pro
6
GROUP BY p.titre
7
)
8
WHERE rank <= 100;

RemarqueClassement sur plusieurs expressions

Il est possible de réaliser des classements sur plusieurs expressions, en spécifiant plusieurs critères dans la clause ORDER BY (traités alors de droite à gauche).

SyntaxeExtrapolation de classement

1
SELECT RANK(n) WITHIN GROUP (ORDER BY b) FROM ...

RANK(n) WITHIN GROUP (ORDER BY b) permet de projeter le classement d'un enregistrement hypothétique dont la valeur de "b" serait "n".

ComplémentAutres fonctions de classement

On notera qu'il existe d'autres fonctions de classement proposées par Oracle 9i :

  • DENSE_RANK

  • PERCENT_RANK

  • CUME_DIST