
DENSE_RANK et NTILE sont deux fonctions analytiques Oracle : DENSE_RANK classe les lignes sans « trou » dans la numérotation en cas d’ex æquo, tandis que NTILE répartit les lignes en N groupes de taille égale (quartiles, déciles…). Voici comment les utiliser, et leur différence avec RANK et ROW_NUMBER.
Le quatuor du classement : RANK, DENSE_RANK, ROW_NUMBER
Toutes numérotent des lignes triées, mais gèrent les ex æquo différemment :
| Notes | ROW_NUMBER | RANK | DENSE_RANK |
|---|---|---|---|
| 20 | 1 | 1 | 1 |
| 20 | 2 | 1 | 1 |
| 18 | 3 | 3 | 2 |
- ROW_NUMBER : numéro unique, ignore les ex æquo.
- RANK : même rang pour les ex æquo, puis saute (1,1,3).
- DENSE_RANK : même rang pour les ex æquo, sans trou (1,1,2).
DENSE_RANK : syntaxe et exemple
SELECT nom, note,
DENSE_RANK() OVER (ORDER BY note DESC) AS rang
FROM eleves;Idéal pour « le top 3 des notes distinctes » : les ex æquo partagent le rang, et la numérotation reste continue.
DENSE_RANK avec PARTITION BY
-- classement par classe
SELECT classe, nom, note,
DENSE_RANK() OVER (PARTITION BY classe ORDER BY note DESC) AS rang
FROM eleves;Trouver le N-ième salaire le plus élevé
SELECT * FROM (
SELECT nom, salaire,
DENSE_RANK() OVER (ORDER BY salaire DESC) AS rng
FROM employes
) WHERE rng = 2; -- le 2ème salaire le plus élevé (ex æquo inclus)NTILE : répartir en N groupes
NTILE(n) découpe l’ensemble trié en n paquets de taille (presque) égale, et numérote chaque ligne par son paquet.
-- répartir les clients en 4 quartiles de chiffre d'affaires
SELECT nom, ca,
NTILE(4) OVER (ORDER BY ca DESC) AS quartile
FROM clients;
-- quartile 1 = top 25%, quartile 4 = bottom 25%Cas d’usage : segmentation (quartiles, déciles), répartition de charge, percentiles approximatifs.
Quand utiliser quoi ?
- Numéro de ligne unique (pagination, dédoublonnage) → ROW_NUMBER.
- Classement type podium (avec sauts) → RANK.
- Classement continu (top N de valeurs distinctes) → DENSE_RANK.
- Répartition en groupes égaux (quartiles…) → NTILE.
FAQ
Quelle différence entre RANK et DENSE_RANK ?
RANK saute des rangs après des ex æquo (1,1,3) ; DENSE_RANK ne saute pas (1,1,2). DENSE_RANK est parfait pour « les N meilleures valeurs distinctes ».
NTILE garantit-il des groupes parfaitement égaux ?
Presque : si le nombre de lignes n’est pas divisible par n, les premiers groupes reçoivent une ligne de plus.
Ces fonctions ont-elles besoin de GROUP BY ?
Non : ce sont des fonctions analytiques (clause OVER). Elles gardent le détail des lignes, contrairement aux agrégats avec GROUP BY.
