Leçon 2 / 9 — Chapitre 1: Classer avec ROW_NUMBER, RANK, DENSE_RANK
ROW_NUMBER()
ROW_NUMBER() OVER (ORDER BY colonne) attribue un numéro de ligne unique, croissant, selon l'ordre indiqué.
SELECT nom, anciennete,
ROW_NUMBER() OVER (ORDER BY anciennete DESC, id ASC) AS rang
FROM employes;
Trié par ancienneté décroissante (le plus ancien en premier), avec l'id comme départage en cas d'égalité : David (7 ans, id 4) et Farid (7 ans, id 6) sont ex-aequo sur l'ancienneté, mais ROW_NUMBER() leur attribue quand même deux rangs différents et uniques (1 et 2, départagés par id) — jamais le même numéro deux fois.
À retenir :
ROW_NUMBER() OVER (ORDER BY colonne)numérote chaque ligne, de 1 à N, sans jamais répéter un numéro.- En cas d'ex-aequo sur la colonne de tri, l'ordre entre les lignes concernées n'est pas garanti sans un critère de départage supplémentaire (ici,
id ASC). - Contrairement à
RANK()(leçon 5),ROW_NUMBER()ne laisse jamais deux lignes avec le même numéro.
À vous de jouer : calculez le rang d'Amara dans ce classement global.
À vous de jouer
À faireVoici une table employes :
employes
id | nom | equipe | anciennete
1 | Amara | ventes | 5
2 | Baptiste | ventes | 3
3 | Chloé | ventes | 3
4 | David | support | 7
5 | Elise | support | 2
6 | Farid | support | 7
Dans le résultat de SELECT nom, anciennete, ROW_NUMBER() OVER (ORDER BY anciennete DESC, id ASC) AS rang FROM employes;, quel rang reçoit Baptiste ?
Testez cette requête dans un bac à sable SQL en ligne (SQLite Fiddle, W3Schools "Try SQL", ou tout autre) pour vérifier le résultat avant de répondre.
💡 Un nombre.
À vous de jouer
À faireDans le résultat de la même requête, quel rang reçoit Farid ?
Testez cette requête dans un bac à sable SQL en ligne (SQLite Fiddle, W3Schools "Try SQL", ou tout autre) pour vérifier le résultat avant de répondre.
💡 Un nombre.