PaliSkill
← SQL — Fonctions de fenêtrage

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 BY dans OVER(...) détermine le calcul du rang, pas l'ordre d'affichage des lignes du résultat.
  • Un ORDER BY final (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

À faire

Dans 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

À faire

Voici 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.

Quitter le module