DENSE_RANK et NTILE en Oracle : classements et quartiles

DENSE_RANK classe sans trou les ex æquo, NTILE répartit en N groupes égaux. Différences avec RANK/ROW_NUMBER, le N-ième salaire et exemples.

Illustration : DENSE_RANK et NTILE Oracle

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.

Publicité

Le quatuor du classement : RANK, DENSE_RANK, ROW_NUMBER

Toutes numérotent des lignes triées, mais gèrent les ex æquo différemment :

NotesROW_NUMBERRANKDENSE_RANK
20111
20211
18332
  • 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.

Un nouveau tutoriel SQL par semaine

Nous ne spammons pas ! Consultez notre politique de confidentialité pour plus d’informations.

Publicité

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Cours SQL & Oracle — 100% gratuitVoir les cours →