Aide-mémoire3 min de lecture · Mis à jour le 29 sept. 2026

Fonctions de fenêtrage SQL — aide-mémoire analytique

Classements, cumuls, moyennes glissantes et comparaisons période sur période avec les fonctions de fenêtrage SQL.

  • #sql
  • #etl

Syntaxe

fonction(...) OVER (PARTITION BY groupe ORDER BY tri ROWS BETWEEN ... AND ...)

Contrairement à GROUP BY, la fenêtre conserve toutes les lignes.

Classements

SELECT region, vendeur, ca,
       ROW_NUMBER() OVER (PARTITION BY region ORDER BY ca DESC) AS rang_unique,
       RANK()       OVER (PARTITION BY region ORDER BY ca DESC) AS rang_ex_aequo,
       DENSE_RANK() OVER (PARTITION BY region ORDER BY ca DESC) AS rang_dense
FROM ventes_mensuelles;

Top 3 par région : filtrer rang_unique <= 3 dans une requête englobante (CTE).

Cumuls et moyennes glissantes

SELECT jour, ca,
       SUM(ca) OVER (ORDER BY jour) AS ca_cumule,
       AVG(ca) OVER (ORDER BY jour ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS moyenne_7j
FROM ca_journalier;

Comparaison avec la période précédente

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

Part du total

SELECT produit, ca, round(100.0 * ca / SUM(ca) OVER (), 2) AS part_pct FROM ca_produit;

Pièges

  • ORDER BY dans OVER sans cadre explicite → cadre par défaut RANGE UNBOUNDED PRECEDING (valeurs égales regroupées).
  • Diviser par NULLIF(x, 0) pour éviter les divisions par zéro.
  • Un KPI doit être défini par écrit (numérateur, dénominateur, filtres) avant d'être codé.

Autres labs de cette technologie