Guide Pratique : Analyse de l’Évolution d’un Paramètre avec SQL Window Functions

Introduction

Lorsqu’on souhaite suivre l’évolution d’un indicateur, comme le montant des ventes par ville, il est souvent nécessaire de réaliser des calculs sur des partitions de données (exemple : par ville, par date, etc.). Plutôt que de multiplier les jointures ou les sous-requêtes, les fonctions analytiques offrent une solution élégante et performante. Elles permettent de réaliser des calculs cumulés, de comparer des valeurs entre différentes lignes ou d’obtenir des statistiques sur des ensembles de données partitionnées.

Dans ce guide, nous aborderons les principales window functions telles que SUM() OVER, LAG() OVER et d’autres, avec des exemples concrets pour analyser des ventes par ville.

1. Les Fondamentaux des Window Functions

Les window functions permettent d’effectuer des calculs sur un ensemble de lignes définies par une clause PARTITION BY, tout en conservant la granularité de chaque ligne de résultat. Cela signifie que vous pouvez ajouter des colonnes calculées (par exemple, un cumul de ventes) sans avoir besoin d’un agrégat global qui réduirait le nombre de lignes.

Syntaxe de Base

La syntaxe générale d'une window function est la suivante :

 
<fonction>() OVER ( [PARTITION BY colonne1, colonne2, ...] [ORDER BY colonne] )
  • PARTITION BY : Segmente vos données en groupes (par exemple, par ville).
  • ORDER BY : Définit l’ordre dans lequel les calculs seront effectués au sein de chaque partition.

2. Calculer un Cumul de Ventes par Ville

Pour illustrer l’utilisation des window functions, considérons une table ventes avec les colonnes ville, date et montant.

Exemple de Table

ville date montant
Paris 2024-01-01 1500
Paris 2024-01-02 2000
Lyon 2024-01-01 1000
Lyon 2024-01-02 1200

Calcul du Cumul des Ventes

Pour obtenir le cumul des ventes par ville, vous pouvez utiliser la fonction SUM() OVER avec un PARTITION BY sur la ville et un ORDER BY sur la date :

 
SELECT ville, date, montant, SUM(montant) OVER (PARTITION BY ville ORDER BY date) AS cumul_ventes FROM ventes;

Ce calcul vous permet de suivre l’évolution des ventes de chaque ville au fil du temps, sans devoir écrire une requête imbriquée.

3. Comparer les Ventes avec LAG() et LEAD()

Les fonctions LAG() et LEAD() sont très utiles pour comparer la valeur d'une ligne avec celle de la ligne précédente ou suivante, respectivement.

Utilisation de LAG() pour Calculer la Variation

Pour comparer le montant des ventes d’un jour à celui du jour précédent, utilisez la fonction LAG() :

 
SELECT ville, date, montant, LAG(montant) OVER (PARTITION BY ville ORDER BY date) AS montant_precedent, montant - LAG(montant) OVER (PARTITION BY ville ORDER BY date) AS variation FROM ventes;

Cette requête ajoute deux colonnes :

  • montant_precedent qui contient la vente du jour précédent pour la même ville,
  • variation qui calcule la différence entre la vente actuelle et la vente précédente.

4. Autres Fonctions Utiles

En complément des fonctions SUM(), LAG() et LEAD(), d’autres window functions peuvent s’avérer très utiles :

  • AVG() OVER : Pour calculer la moyenne des ventes sur une période donnée.
  • MIN() OVER et MAX() OVER : Pour obtenir respectivement la vente minimale et maximale sur un ensemble de lignes.

Exemple de Moyenne Mobile

Supposons que vous souhaitiez calculer une moyenne mobile sur 3 jours pour chaque ville :

 
SELECT ville, date, montant, AVG(montant) OVER ( PARTITION BY ville ORDER BY date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW ) AS moyenne_mobile FROM ventes;

Ici, la clause ROWS BETWEEN 2 PRECEDING AND CURRENT ROW définit la fenêtre de calcul qui inclut la ligne en cours et les deux lignes précédentes.

5. Avantages des Window Functions

  • Simplicité : Permet d'éviter des sous-requêtes ou des jointures complexes.
  • Performance : Les calculs s’effectuent directement sur les partitions, souvent de manière optimisée par le SGBD.
  • Clarté : Le code est plus lisible et plus facile à maintenir.

Conclusion

Les fonctions analytiques (window functions) sont des outils puissants pour analyser l’évolution d’un paramètre, comme les ventes par ville, de manière simple et efficace. En utilisant SUM() OVER, LAG() OVER et d’autres fonctions similaires, vous pouvez réaliser des calculs cumulés, des comparaisons et des agrégations sans complexifier inutilement vos requêtes SQL. Ces techniques vous permettent de gagner en clarté, en performance et en flexibilité, tout en évitant la lourdeur des jointures complexes ou des sous-requêtes.

Adoptez ces approches pour améliorer vos analyses SQL et rendre vos rapports plus dynamiques et compréhensibles. N’hésitez pas à expérimenter avec différentes fenêtres de calcul et à adapter ces exemples à vos besoins spécifiques !