Cours SQL et MySQL · Module 10: Transactions et SQL avancé
Les fonctions fenêtre - classements dans la Bibliothèque
Dans cette leçon3
Parfois, nous voulons non seulement récupérer des lignes, mais aussi les numéroter ou leur attribuer un rang au sein d'un groupe. C'est à cela que servent les fonctions fenêtre.
ROW_NUMBER - un numéro séquentiel
ROW_NUMBER() attribue à chaque ligne un numéro séquentiel selon l'ordre donné :
1SELECT tytul, cena,
2 ROW_NUMBER() OVER (ORDER BY cena) AS numer
3FROM ksiazki;Le livre le moins cher reçoit le numéro 1, le suivant le 2, et ainsi de suite. La clause OVER (ORDER BY ...) indique selon quoi compter.
RANK - un rang avec égalités
RANK() fonctionne de façon similaire, mais les livres au même prix reçoivent le même rang, et le rang suivant est sauté (1, 2, 2, 4).
1SELECT tytul, cena,
2 RANK() OVER (ORDER BY cena DESC) AS ranga
3FROM ksiazki;PARTITION BY - des classements au sein de groupes
Avec PARTITION BY, nous numérotons séparément au sein de chaque groupe. Nous établissons ainsi un classement des livres par prix à l'intérieur de chaque catégorie :
1SELECT tytul, kategoria_id, cena,
2 ROW_NUMBER() OVER (PARTITION BY kategoria_id ORDER BY cena DESC) AS miejsce
3FROM ksiazki;Le compteur se réinitialise à chaque catégorie. Les fonctions fenêtre sont la puissante longue-vue du Gardien - elles te permettent de comparer et de classer sans perdre les lignes individuelles.
Tu as repéré une erreur dans cette leçon ?
Teste tes connaissances
Réponds aux questions de cette leçon. Choisis une réponse pour voir tout de suite si elle est correcte.
1. À quoi sert la fonction de fenêtrage ROW_NUMBER() OVER (ORDER BY ...) ?
2. À quoi sert la clause OVER dans une fonction de fenêtrage ?
Voici 2 des 3 questions de cette leçon. Réponds aux autres dans le jeu.
Tâches pratiques dans le jeu
- Clique dans l'ordre
Clique sur les éléments dans l'ordre pour construire une fonction de fenêtrage qui numérote les lignes :
- Éditeur de code
Écris une requête qui récupère tytul et cena de la table ksiazki, et ajoute en plus une colonne nommée numer contenant le résultat de ROW_NUMBER() OVER (ORDER BY cena). Utilise le mot AS pour nommer la colonne numer.
- Tri horizontal
Ordonne sur une ligne une fonction de fenêtrage qui numérote les lignes par prix décroissant :
- Éditeur de code
Écris une requête qui récupère tytul et cena de la table ksiazki, et ajoute en plus une colonne nommée ranga contenant le résultat de RANK() OVER (ORDER BY cena DESC). Utilise le mot AS pour nommer la colonne ranga.