0Pricing
SQL Interview Prep · Leçon

Sommes cumulées avec les fenêtres

Construire un total cumulé avec SUM OVER et une fenêtre ordonnée

Sommes cumulées avec les fenêtres est une leçon SQL Interview Prep gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage SQL Interview Prep, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours SQL Interview Prep comprend 4 leçons au total.

La question du total cumulé

Presque tous les entretiens d'analystes comportent une question du type : « Montrez-moi le chiffre d'affaires cumulé au fil du temps. » Un total cumulé est une somme qui augmente ligne après ligne, en accumulant tout depuis le début jusqu'à la ligne actuelle.

Avant l'existence des fonctions de fenêtre, les candidats résolvaient ce problème avec une auto-jointure lente ou une sous-requête corrélée. La réponse moderne attendue est SUM(...) OVER (ORDER BY ...). Connaître la version utilisant un cadre de fenêtre montre que vous comprenez le SQL écrit depuis environ 2012.

Anatomie d'une somme de fenêtre ordonnée

Un total cumulé est simplement un agrégat transformé en fonction de fenêtre. Vous conservez SUM(amount), mais vous ajoutez une clause OVER contenant un ORDER BY.

C'est le ORDER BY situé dans OVER qui rend le calcul cumulatif : il indique à SQL d'accumuler les lignes dans cet ordre. Sans ORDER BY, SUM totaliserait toute la partition pour chaque ligne au lieu d'augmenter progressivement.

SELECT
  sale_date,
  amount,
  SUM(amount) OVER (ORDER BY sale_date) AS running_total
FROM sales
ORDER BY sale_date;

Pourquoi ORDER BY implique un cadre

Voici le détail que les recruteurs aiment vérifier : lorsque vous ajoutez ORDER BY à un agrégat de fenêtre, SQL applique un cadre par défaut égal à RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.

C'est exactement ce cadre par défaut qui produit un total cumulé : chaque ligne depuis le début de la partition jusqu'à la ligne actuelle, celle-ci comprise. Si vous comprenez ce comportement par défaut, vous comprenez pourquoi la somme cumulée « fonctionne toute seule ».

Rendre le cadre explicite

Vous pouvez écrire le cadre manuellement. Ces deux requêtes renvoient le même résultat, mais la version explicite montre au recruteur que vous savez ce qui se passe en interne.

Écrire ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW est la forme explicite la plus sûre pour un total cumulé, car elle compte les lignes physiques et évite les surprises liées au regroupement des valeurs avec RANGE (étudié dans la prochaine leçon).

SELECT
  sale_date,
  amount,
  SUM(amount) OVER (
    ORDER BY sale_date
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
  ) AS running_total
FROM sales;

Exemple détaillé : ventes quotidiennes

Imaginez quatre jours de ventes : lun. 100, mar. 50, mer. 200, jeu. 75. Le total cumulé s'accumule de gauche à droite.

  • Lun. : 100
  • Mar. : 100 + 50 = 150
  • Mer. : 150 + 200 = 350
  • Jeu. : 350 + 75 = 425

La dernière ligne est toujours égale au total général. C'est une vérification rapide que vous pouvez mentionner en entretien : la dernière valeur du total cumulé doit correspondre à SUM(amount) calculé sur l'ensemble des données.

Réinitialiser par groupe avec PARTITION BY

Les questions réelles demandent généralement un total cumulé par client ou par région, et non un total global unique. Ajoutez PARTITION BY pour que l'accumulation recommence au début de chaque partition.

Le modèle mental est le suivant : PARTITION BY répartit les lignes dans des groupes indépendants, et la combinaison ORDER BY et cadre s'exécute séparément dans chaque groupe.

SELECT
  customer_id,
  sale_date,
  amount,
  SUM(amount) OVER (
    PARTITION BY customer_id
    ORDER BY sale_date
  ) AS customer_running_total
FROM sales;

Le piège du départage

Si deux lignes partagent la même valeur de ORDER BY (deux ventes le même jour), le cadre par défaut RANGE les traite comme des lignes paires et leur attribue le même total cumulé, en incluant les deux montants.

Si vous avez besoin d'une progression strictement ligne par ligne, même en cas d'égalité, utilisez un cadre ROWS et ajoutez un critère de départage unique à ORDER BY, par exemple sale_date, id. Les recruteurs introduisent volontairement des dates en double pour voir si vous le remarquez.

SELECT
  sale_date,
  amount,
  SUM(amount) OVER (
    ORDER BY sale_date, id
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
  ) AS running_total
FROM sales;

Total cumulé d'un décompte

La logique cumulative ne se limite pas à SUM. Tout agrégat peut être utilisé comme fonction de fenêtre, ce qui vous permet de construire un décompte, une moyenne ou un maximum cumulés.

Le décompte cumulé des commandes est un indicateur courant dans un tableau de bord : combien de commandes avons-nous reçues jusqu'à chaque jour ?

SELECT
  order_date,
  COUNT(*) OVER (
    ORDER BY order_date
  ) AS orders_to_date
FROM orders;

L'ancienne méthode : sous-requête corrélée

Les recruteurs vous demandent parfois de résoudre un total cumulé sans fonctions de fenêtre afin d'évaluer la profondeur de vos connaissances. La solution classique d'avant les fonctions de fenêtre est une sous-requête corrélée qui recalcule la somme de toutes les lignes précédentes.

Elle fonctionne, mais sa complexité est en O(n²) : pour chaque ligne, elle reparcourt la table. Mentionnez-le pour montrer que vous savez pourquoi les fonctions de fenêtre l'ont remplacée.

SELECT
  s.sale_date,
  s.amount,
  (SELECT SUM(s2.amount)
   FROM sales s2
   WHERE s2.sale_date <= s.sale_date) AS running_total
FROM sales s
ORDER BY s.sale_date;

Filtrage et résultat de la fenêtre

Une question complémentaire fréquente est : « Montrez uniquement les jours où le total cumulé a dépassé 1000. » Vous ne pouvez pas placer une fonction de fenêtre dans WHERE, car le cadre est calculé après l'exécution de WHERE.

La solution consiste à calculer le total cumulé dans une CTE ou une sous-requête, puis à filtrer dans la requête externe. C'est la même règle d'encapsulation qui s'applique à toutes les fonctions de fenêtre.

WITH t AS (
  SELECT
    sale_date,
    SUM(amount) OVER (ORDER BY sale_date) AS running_total
  FROM sales
)
SELECT *
FROM t
WHERE running_total >= 1000;

Points à mentionner en entretien

Lorsque vous présentez une réponse sur les totaux cumulés, expliquez ces points pour obtenir tous les points :

  • SUM OVER (ORDER BY ...) est la forme cumulative.
  • L'ajout de ORDER BY crée un cadre par défaut allant de UNBOUNDED PRECEDING à CURRENT ROW.
  • Utilisez PARTITION BY pour réinitialiser le calcul par groupe.
  • Ajoutez un critère de départage unique et un cadre ROWS pour éviter le piège des valeurs en double.
  • Encapsulez le calcul dans une CTE pour filtrer sur son résultat.

Vérification rapide

Évaluez votre compréhension du cadre par défaut.

Récapitulatif : sommes cumulées

Un total cumulé est un agrégat de fenêtre ordonné. SUM(amount) OVER (ORDER BY sale_date) accumule les lignes depuis le début de la partition jusqu'à la ligne actuelle, grâce au cadre implicite allant de UNBOUNDED PRECEDING à CURRENT ROW.

Réinitialisez-le par groupe avec PARTITION BY, ajoutez un critère de départage ainsi qu'un cadre ROWS pour gérer les valeurs de tri en double, et encapsulez-le dans une CTE chaque fois que vous devez filtrer sur la valeur cumulative. Ensuite, nous examinerons en détail la distinction entre ROWS et RANGE annoncée dans cette leçon.

Questions Fréquemment Posées

La leçon « Sommes cumulées avec les fenêtres » est-elle gratuite ?

Oui — le texte complet de « Sommes cumulées avec les fenêtres » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours SQL Interview Prep, passe à CoddyKit PRO. Le cours SQL Interview Prep comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Sommes cumulées avec les fenêtres » ?

Construire un total cumulé avec SUM OVER et une fenêtre ordonnée Tu pratiques SQL Interview Prep avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer SQL Interview Prep ?

Aucune expérience préalable n'est requise. SQL Interview Prep sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.

Combien de temps prend la leçon « Sommes cumulées avec les fenêtres » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon SQL Interview Prep ?

Oui. Chaque leçon SQL Interview Prep inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Sommes cumulées avec les fenêtres
  2. Fenêtres ROWS ou RANGE
  3. Moyennes mobiles sur une fenêtre glissante
  4. Distribution cumulée et pourcentage du total
← Retour à SQL Interview Prep