Cours SQL et MySQL · Module 10: Transactions et SQL avancé

Les fonctions fenêtre - classements dans la Bibliothèque

2 min de lecture
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. 1. À quoi sert la fonction de fenêtrage ROW_NUMBER() OVER (ORDER BY ...) ?

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