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.

