← Guides

Fonctions de fenêtrage SQL pour débutants : cumuls, classements et évolution mensuelle

ROW_NUMBER, RANK, SUM OVER et LAG expliqués sur une table de ventes, avec la question métier à laquelle chacune répond.

SQL · 8 min de lecture

Le principe

Une fonction de fenêtrage calcule une valeur sur un ensemble de lignes liées à la ligne courante, sans les regrouper comme GROUP BY. OVER() définit la fenêtre : PARTITION BY crée des groupes, ORDER BY fixe l'ordre.

Cumul

Le chiffre d'affaires cumulé par mois tient en une ligne.

SELECT mois, ca,
       SUM(ca) OVER (ORDER BY mois) AS cumul
FROM ventes_mensuelles;

Top N par groupe

« Les 3 meilleurs produits par catégorie » : numérotez dans chaque catégorie puis filtrez.

SELECT * FROM (
  SELECT categorie, produit, ca,
         ROW_NUMBER() OVER (PARTITION BY categorie ORDER BY ca DESC) AS rn
  FROM ventes_produits
) t
WHERE rn <= 3;

ROW_NUMBER, RANK ou DENSE_RANK

Avec deux ex æquo : ROW_NUMBER donne 1 et 2, RANK 1, 1, 3 et DENSE_RANK 1, 1, 2. RANK pour les classements, ROW_NUMBER pour exactement N lignes.

Évolution mensuelle avec LAG

LAG lit la valeur de la ligne précédente ; NULLIF évite la division par zéro.

SELECT mois, ca,
       ROUND(100.0 * (ca - LAG(ca) OVER (ORDER BY mois))
             / NULLIF(LAG(ca) OVER (ORDER BY mois), 0), 1) AS evolution_pct
FROM ventes_mensuelles;

Compatibilité

Disponibles sur PostgreSQL, SQL Server, Oracle, SQLite 3.25+, MySQL 8+ et BigQuery, mais pas sur MySQL 5.7. Précisez votre moteur dans FormulAI pour une syntaxe adaptée.