Leçon 3 / 9 — Chapitre 1: Classer avec ROW_NUMBER, RANK, DENSE_RANK
ORDER BY à l'intérieur d'une fonction de fenêtrage
Le ORDER BY placé à l'intérieur de OVER(...) détermine le calcul de la fonction de fenêtrage (l'ordre dans lequel les rangs sont attribués) — ce n'est pas le même ORDER BY que celui, optionnel, placé à la toute fin d'une requête pour trier l'affichage des résultats.
SELECT nom, anciennete,
ROW_NUMBER() OVER (ORDER BY anciennete DESC, id ASC) AS rang
FROM employes;
Sans ORDER BY final sur cette requête, les lignes du résultat peuvent s'afficher dans n'importe quel ordre (généralement l'ordre naturel de la table) — seule la colonne rang reflète le classement calculé. Pour que les lignes s'affichent réellement triées par rang, il faut ajouter un ORDER BY final :
SELECT nom, anciennete,
ROW_NUMBER() OVER (ORDER BY anciennete DESC, id ASC) AS rang
FROM employes
ORDER BY rang;
Le sens du tri à l'intérieur de OVER(...) change aussi le résultat : ORDER BY anciennete ASC (au lieu de DESC) inverserait complètement le classement — le moins ancien deviendrait le rang 1.
À retenir :
- Le
ORDER BYdansOVER(...)détermine le calcul du rang, pas l'ordre d'affichage des lignes du résultat. - Un
ORDER BYfinal (en dehors de OVER(...)) reste nécessaire pour que les lignes s'affichent réellement triées. - Inverser ASC/DESC dans
OVER(ORDER BY ...)inverse le sens du classement calculé.
À vous de jouer : ajoutez ORDER BY rang à la fin de la requête ROW_NUMBER de la leçon précédente, et vérifiez que les lignes s'affichent maintenant dans l'ordre du classement.
À vous de jouer
À faireDans SELECT nom, ROW_NUMBER() OVER (ORDER BY anciennete DESC) AS rang FROM employes; (sans ORDER BY à la fin de la requête), l'ordre d'affichage des lignes du résultat correspond-il forcément à la colonne rang ? Répondez par oui ou non.
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.
💡 Oui ou non.
À 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 SELECT nom, anciennete, ROW_NUMBER() OVER (ORDER BY anciennete ASC, id ASC) AS rang FROM employes; (ASC au lieu de DESC), quel rang reçoit Elise ?
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.