Aller au contenu

Window functions

·2 mins·
SQL Formation
SQL - Cet article fait partie d'une série.
Partie 13: Cet article

📌 Qu’est-ce qu’une fonction fenĂȘtre ?
#

Une fonction fenĂȘtre :

  • Travaille ligne par ligne,
  • Peut accĂ©der aux lignes voisines,
  • Ne rĂ©duit pas le nombre de lignes (contrairement au GROUP BY).

Elle repose sur la clause :

OVER (
  PARTITION BY ...
  ORDER BY ...
  ROWS BETWEEN ...
)

🧭 Navigation dans les lignes
#

  • LAG(): valeur prĂ©cĂ©dente

    SELECT
      client_id,
      date_commande,
      LAG(date_commande) OVER (
        PARTITION BY client_id
        ORDER BY date_commande
      ) AS prev_date
    FROM commandes;
    
  • LEAD(): valeur suivante

    SELECT
      client_id, date_commande,
      LEAD(date_commande) OVER (
        PARTITION BY client_id
        ORDER BY date_commande
      ) AS next_date
    FROM commandes;
    
  • FIRST_VALUE() / LAST_VALUE():

    SELECT
      client_id, montant,
      FIRST_VALUE(montant) OVER (
        PARTITION BY client_id
        ORDER BY date_commande
      ) AS montant_initial
    FROM commandes;
    

    ⚠ LAST_VALUE() nĂ©cessite souvent un ROWS BETWEEN UNBOUNDED FOLLOWING selon les moteurs.


📊 Fonctions cumulĂ©es
#

Exemple : cumul du montant des commandes

SELECT
  client_id,
  date_commande,
  montant,
  SUM(montant) OVER (
    PARTITION BY client_id
    ORDER BY date_commande
  ) AS cumul_client
FROM commandes;

⚙ Options de fenĂȘtre
#

OptionEffet
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROWCumul depuis le début
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWINGFenĂȘtre glissante autour de chaque ligne
PARTITION BYRéinitialise le calcul par groupe
ORDER BYDéfinit la progression dans le groupe

🧯 PiĂšges frĂ©quents
#

⚠ PiĂšge✅ Solution
Oublier ORDER BY → rĂ©sultats instablesToujours ordonner les valeurs
Mélanger GROUP BY avec OVER()Comprendre que OVER ne réduit pas les lignes
LAST_VALUE() renvoie la valeur couranteAjouter ROWS BETWEEN UNBOUNDED FOLLOWING
FenĂȘtre trop large → rĂ©sultats absurdesAjuster ROWS BETWEEN ... selon le besoin

đŸ‹ïžâ€â™‚ïž EntraĂźnement
#

  • Obtenir la date prĂ©cĂ©dente et suivante de chaque commande (LAG / LEAD).
  • Calculer l’évolution du montant d’un client (montant courant vs prĂ©cĂ©dent).
  • Construire le montant cumulĂ© par client.
  • Calculer la diffĂ©rence entre deux jours successifs pour un produit.
duckdb.sql("""
SELECT
  client_id, date_commande, montant,
  LAG(montant) OVER (PARTITION BY client_id ORDER BY date_commande) AS prev,
  SUM(montant) OVER (PARTITION BY client_id ORDER BY date_commande) AS cumul
FROM commandes
""").df()

📚 Ressources utiles
#

Thibault CLEMENT - Intechnia
Auteur
Thibault CLEMENT - Intechnia
Data scientist
SQL - Cet article fait partie d'une série.
Partie 13: Cet article