0Pricing
SQL Interview Prep · Leçon

Évolution d’une période à l’autre

Calculer la croissance mensuelle et les variations quotidiennes avec LAG

Évolution d’une période à l’autre est une leçon SQL Interview Prep gratuite sur CoddyKit. Ceci est la leçon 2 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 incontournable pour les analystes

Si vous passez un entretien pour un poste d'analyste de données, attendez-vous à ce qu'on vous demande : « Calculez la croissance mensuelle par rapport au mois précédent » ou « Quelle est l'évolution d'un jour à l'autre ? » C'est presque inévitable.

L'élément de base est LAG : récupérez la valeur de la période précédente, puis calculez un écart absolu ou une variation en pourcentage. Cette leçon transforme LAG en modèles d'évolution d'une période à l'autre sur lesquels les recruteurs vous évalueront.

Évolution absolue avec LAG

La version la plus simple est la différence brute entre cette période et la précédente. Récupérez la valeur précédente avec LAG, puis soustrayez-la directement.

La première ligne dans l'ordre n'a pas de ligne précédente, sa variation vaut donc NULL. C'est correct, et non une erreur : il n'existe véritablement aucune période précédente à comparer.

SELECT
  month,
  revenue,
  revenue - LAG(revenue) OVER (ORDER BY month) AS mom_change
FROM monthly_sales
ORDER BY month;

Variation en pourcentage

Les recruteurs veulent généralement connaître la croissance en pourcentage. La formule est (valeur actuelle - valeur précédente) / valeur précédente, puis multipliez par 100. Exprimez-la directement avec LAG.

Faites attention à l'ordre des opérations et aux parenthèses ; une parenthèse mal placée est une erreur classique sous pression.

SELECT
  month,
  revenue,
  100.0 * (revenue - LAG(revenue) OVER (ORDER BY month))
        / LAG(revenue) OVER (ORDER BY month) AS pct_growth
FROM monthly_sales
ORDER BY month;

Éviter la division entière

Voici un piège dans lequel tombent de nombreux candidats : si revenue est un entier, (110 - 100) / 100 est évalué à 0 dans les bases de données qui effectuent une division entière.

Multipliez par 100.0 (un littéral flottant) ou utilisez CAST pour convertir d'abord en nombre décimal, afin d'imposer un calcul en virgule flottante. Le signaler spontanément montre votre souci du détail.

SELECT
  month,
  ROUND(
    100.0 * (revenue - LAG(revenue) OVER (ORDER BY month))
          / LAG(revenue) OVER (ORDER BY month), 2
  ) AS pct_growth
FROM monthly_sales;

Plus clair : calculer une seule fois dans un CTE

Appeler LAG deux fois (pour le numérateur et le dénominateur) est répétitif et il est facile de faire une erreur de saisie. Une réorganisation courante consiste à calculer la valeur précédente une seule fois dans un CTE, puis à effectuer les opérations arithmétiques dans la requête externe.

Cette solution est plus lisible lors d'un entretien au tableau blanc et évite que les deux appels à LAG divergent.

WITH t AS (
  SELECT
    month,
    revenue,
    LAG(revenue) OVER (ORDER BY month) AS prev
  FROM monthly_sales
)
SELECT
  month,
  revenue,
  ROUND(100.0 * (revenue - prev) / prev, 2) AS pct_growth
FROM t;

Éviter la division par zéro

Si la valeur de la période précédente peut être 0, la formule en pourcentage provoque une division par zéro et une erreur. Utilisez NULLIF(prev, 0) afin que le dénominateur devienne NULL et que le résultat soit NULL plutôt qu'une exception.

Une division protégée est un petit détail que les recruteurs remarquent chez les candidats soucieux des contraintes de production.

SELECT
  month,
  revenue,
  100.0 * (revenue - prev) / NULLIF(prev, 0) AS pct_growth
FROM (
  SELECT month, revenue,
         LAG(revenue) OVER (ORDER BY month) AS prev
  FROM monthly_sales
) s;

Évolution d'une période à l'autre par groupe

La plupart des questions réelles sont définies par périmètre : croissance mensuelle par produit ou par région. Ajoutez PARTITION BY afin que la série de chaque groupe soit comparée uniquement à elle-même.

Le premier mois de chaque groupe est réinitialisé à NULL ; aucune comparaison n'est donc effectuée entre des produits différents.

SELECT
  product_id,
  month,
  revenue,
  revenue - LAG(revenue) OVER (
    PARTITION BY product_id
    ORDER BY month
  ) AS mom_change
FROM product_sales;

Évolution d'une année à l'autre avec un décalage

Pour calculer l'évolution d'une année à l'autre sur des données mensuelles où les lignes sont espacées d'un mois, comparez la valeur à celle située 12 lignes plus haut. L'argument de décalage permet de le faire directement : LAG(revenue, 12).

Cela suppose une ligne par mois, sans lacune. Si des mois peuvent manquer, vous devrez plutôt effectuer une jointure sur une date explicite, un détail subtil qu'il vaut la peine de mentionner à voix haute.

SELECT
  month,
  revenue,
  revenue - LAG(revenue, 12) OVER (ORDER BY month) AS yoy_change
FROM monthly_sales
ORDER BY month;

Agrégéz avant de comparer

Les tables d'événements brutes ne sont pas préagrégées par mois. Une réponse réaliste commence par agréger les données pour obtenir une ligne par période, puis applique LAG au résultat agrégé, généralement via un CTE.

Appliquer LAG à des lignes non agrégées compare des transactions individuelles, et non les totaux mensuels : c'est une erreur logique courante.

WITH monthly AS (
  SELECT DATE_TRUNC('month', order_date) AS mth,
         SUM(amount) AS revenue
  FROM orders
  GROUP BY 1
)
SELECT mth, revenue,
       revenue - LAG(revenue) OVER (ORDER BY mth) AS mom_change
FROM monthly
ORDER BY mth;

Interpréter le premier NULL

Les recruteurs demandent parfois : « Pourquoi la croissance de votre première ligne vaut-elle NULL, et est-ce acceptable ? » La bonne réponse est la suivante : il n'existe aucune période précédente, la variation n'est donc pas définie, et NULL la représente correctement.

Si l'activité exige plutôt 0, vous utiliseriez LAG(revenue, 1, 0) ou COALESCE, mais uniquement si cela correspond au sens recherché.

Indiquer le sens de l'évolution

Les recruteurs prolongent parfois la question : « Indiquez aussi si chaque mois a progressé, reculé ou est resté stable. » Encadrez la comparaison avec LAG dans une expression CASE.

La comparaison avec la valeur précédente fournit une colonne de tendance claire et compréhensible, en complément de l'écart numérique, et affiche correctement NULL ou une étiquette par défaut pour la première période qui n'a aucune comparaison.

SELECT
  month,
  revenue,
  CASE
    WHEN revenue > LAG(revenue) OVER (ORDER BY month) THEN 'up'
    WHEN revenue < LAG(revenue) OVER (ORDER BY month) THEN 'down'
    ELSE 'flat'
  END AS trend
FROM monthly_sales
ORDER BY month;

Vérification rapide

Repérez l'erreur courante dans les requêtes de variation en pourcentage.

Récapitulatif

L'évolution d'une période à l'autre repose sur LAG et des opérations arithmétiques :

  • Évolution absolue : value - LAG(value) OVER (ORDER BY period).
  • Variation en pourcentage : 100.0 * (value - prev) / NULLIF(prev, 0).
  • Imposez les calculs en virgule flottante, protégez-vous contre la division par zéro et préagrégez les données pour obtenir une ligne par période.
  • Limitez le périmètre avec PARTITION BY et utilisez le décalage pour l'évolution d'une année à l'autre.

Ensuite : répartir les lignes en groupes et en niveaux avec NTILE.

Questions Fréquemment Posées

La leçon « Évolution d’une période à l’autre » est-elle gratuite ?

Oui — le texte complet de « Évolution d’une période à l’autre » 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 « Évolution d’une période à l’autre » ?

Calculer la croissance mensuelle et les variations quotidiennes avec LAG 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 2 sur 4.

Combien de temps prend la leçon « Évolution d’une période à l’autre » ?

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. LAG et LEAD pour les lignes adjacentes
  2. Évolution d’une période à l’autre
  3. NTILE pour créer des tranches
  4. FIRST_VALUE, LAST_VALUE et limites de fenêtre
← Retour à SQL Interview Prep