PaliSkill
SQL — Fonctions de fenêtrage

Leçon 1 / 9 — Chapitre 3: LAG et LEAD approfondis

LAG() et LEAD() : valeur de la ligne précédente/suivante

LAG(colonne) OVER (...) renvoie la valeur de la ligne précédente, selon l'ordre défini ; LEAD(colonne) OVER (...) renvoie celle de la ligne suivante. Pour la toute première (ou dernière) ligne d'une partition, il n'existe pas de ligne précédente (ou suivante) : le résultat est alors NULL.

SELECT nom, equipe, anciennete,
  LAG(anciennete) OVER (PARTITION BY equipe ORDER BY anciennete DESC, id ASC) AS anciennete_precedente
FROM employes;

Dans l'équipe support (ordre : David, Farid, Elise), Farid reçoit l'ancienneté de David (7) comme anciennete_precedente ; Elise reçoit celle de Farid (7). David, premier de sa partition, n'a pas de ligne précédente : anciennete_precedente vaut NULL pour lui.

À retenir :

  • LAG(colonne) OVER (...) accède à la valeur de la ligne précédente (selon l'ORDER BY du OVER) ; LEAD(colonne) fait l'inverse, avec la ligne suivante.
  • La première ligne d'une partition n'a pas de ligne précédente : LAG y renvoie NULL (symétriquement pour LEAD sur la dernière ligne).
  • Comme les autres fonctions de fenêtrage, LAG/LEAD se combinent avec PARTITION BY pour comparer une ligne à sa voisine au sein du même groupe.

À vous de jouer : ajoutez une colonne LEAD(anciennete) OVER (...) à cette requête, et vérifiez qu'elle vaut NULL pour Elise (dernière de son équipe).

À 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 le résultat de :

SELECT nom, equipe, anciennete,
  LAG(anciennete) OVER (PARTITION BY equipe ORDER BY anciennete DESC, id ASC) AS anciennete_precedente
FROM employes;

quelle est la valeur de anciennete_precedente pour 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.

À vous de jouer

À faire

Dans le résultat de la même requête, quelle est la valeur de anciennete_precedente pour David ?

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.

💡 Une valeur spéciale SQL (en majuscules).

Quitter le module