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
À 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 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
À faireDans 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).