Classements
Syntaxe : Projection de classement
SELECT RANK() OVER (PARTITION BY a ORDER BY b DESC), ...
FROM ...
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 :
SELECT * FROM
(
SELECT p.titre AS titre, count(*) AS ventes, RANK() OVER (ORDER BY count(*) DESC) AS rank
FROM ventes v, produit p
WHERE p.isbn=v.pro
GROUP BY p.titre
)
WHERE rank <= 100;
Remarque : Classement 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).
Syntaxe : Extrapolation de classement
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ément : Autres fonctions de classement
On notera qu'il existe d'autres fonctions de classement proposées par Oracle 9i :
DENSE_RANK
PERCENT_RANK
CUME_DIST