Moyennes mobiles sur une fenêtre glissante
Calculer des moyennes glissantes sur N périodes avec BETWEEN PRECEDING et CURRENT ROW
Moyennes mobiles sur une fenêtre glissante est une leçon Coding Interview Prep gratuite sur CoddyKit. Ceci est la leçon 3 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 Coding Interview Prep, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Coding Interview Prep comprend 4 leçons au total.
La question de la moyenne mobile
Les analystes se voient constamment poser cette question : « Calculez une moyenne mobile sur 7 jours du chiffre d’affaires. » Une moyenne mobile lisse les données quotidiennes bruitées en faisant la moyenne de chaque point avec ses voisins récents.
La réponse attendue en entretien est une fonction de fenêtre AVG avec un cadre glissant explicite. La compétence clé consiste à choisir les bornes du cadre afin que la fenêtre se déplace correctement dans l’ordre.
Le modèle essentiel
Une moyenne mobile s’écrit AVG(value) OVER (ORDER BY ... ROWS BETWEEN n PRECEDING AND CURRENT ROW). Le cadre se déplace : pour chaque ligne, il couvre la ligne actuelle et les n lignes précédentes.
Pour une fenêtre de 7 jours sur des lignes quotidiennes, reculez de 6 lignes, puis ajoutez la ligne actuelle, ce qui donne 7 lignes au total. Cette erreur de décompte d’une unité est la plus courante parmi celles que les recruteurs repèrent en entretien.
SELECT
sale_date,
amount,
AVG(amount) OVER (
ORDER BY sale_date
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
) AS moving_avg_7d
FROM daily_sales;Compter correctement la taille de la fenêtre
La taille de la fenêtre est égale à preceding + 1 (le +1 correspond à la ligne actuelle). Ainsi :
- Fenêtre de 3 lignes :
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW - Fenêtre de 7 lignes :
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW - Fenêtre de 30 lignes :
ROWS BETWEEN 29 PRECEDING AND CURRENT ROW
Énoncez ce calcul à voix haute en entretien afin que le jury voie que vous procédez délibérément et non au hasard.
Fenêtres centrées et rétrospectives
L’exemple ci-dessus est une moyenne rétrospective : elle ne regarde que vers le passé, donc elle est causale et sûre pour les tableaux de bord de prévision.
Une moyenne centrée regarde dans les deux directions, par exemple ROWS BETWEEN 3 PRECEDING AND 3 FOLLOWING pour une fenêtre centrée de 7 lignes. Les fenêtres centrées lissent les données de manière plus symétrique, mais ne peuvent pas être calculées en temps réel pour les lignes les plus récentes. Précisez laquelle est requise par le cas d’utilisation.
SELECT
sale_date,
AVG(amount) OVER (
ORDER BY sale_date
ROWS BETWEEN 3 PRECEDING AND 3 FOLLOWING
) AS centered_avg_7
FROM daily_sales;L’effet aux limites de la fenêtre
Au tout début des données, la fenêtre complète n’existe pas encore. Pour la première ligne d’une moyenne rétrospective sur 7 jours, une seule ligne est disponible, donc AVG ne fait la moyenne que de cette valeur.
Les premières lignes affichent ainsi une moyenne de « mise en route » calculée sur moins de lignes. Les recruteurs demandent souvent comment gérer ce cas. Deux options s’offrent à vous : accepter la fenêtre partielle ou masquer les premières lignes en exigeant un nombre de lignes égal à la taille complète de la fenêtre.
Supprimer les fenêtres partielles
Si le métier souhaite obtenir NULL tant que la fenêtre complète n’est pas disponible, utilisez COUNT(*) sur le même cadre et mettez à vide les fenêtres trop courtes avec une expression CASE.
Cette attention montre que vous avez réfléchi à la justesse des résultats aux limites, un détail que beaucoup de candidats négligent.
SELECT
sale_date,
CASE WHEN COUNT(*) OVER w = 7
THEN AVG(amount) OVER w
END AS moving_avg_7d
FROM daily_sales
WINDOW w AS (
ORDER BY sale_date
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
);Réutiliser un cadre avec WINDOW
La requête précédente utilisait une clause WINDOW nommée. Lorsque le même cadre apparaît plusieurs fois, le définir une seule fois avec WINDOW w AS (...) et faire référence à OVER w permet de garder la requête DRY et lisible.
PostgreSQL, MySQL 8 et le serveur SQL prennent en charge les fenêtres nommées. En utiliser une en entretien montre une maîtrise des fonctions de fenêtre qui va au-delà du simple copier-coller.
SELECT
sale_date,
AVG(amount) OVER w AS avg_7d,
SUM(amount) OVER w AS sum_7d
FROM daily_sales
WINDOW w AS (
ORDER BY sale_date
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
);Piège : jours calendaires et lignes
Un piège subtil : si la table comporte des jours manquants, ROWS 6 PRECEDING couvre les 7 dernières lignes enregistrées, ce qui peut représenter plus de 7 jours calendaires.
Pour une véritable moyenne sur 7 jours calendaires qui respecte les lacunes, utilisez RANGE avec un décalage d’intervalle, ou effectuez d’abord une jointure avec une série complète de dates afin que chaque jour possède une ligne. Rappeler cette distinction correspond exactement à l’idée essentielle de la leçon précédente sur ROWS et RANGE.
SELECT
sale_date,
AVG(amount) OVER (
ORDER BY sale_date
RANGE BETWEEN INTERVAL '6 days' PRECEDING AND CURRENT ROW
) AS calendar_avg_7d
FROM daily_sales;Moyennes mobiles par groupe
Comme pour les totaux cumulés, les moyennes mobiles doivent généralement être réinitialisées pour chaque entité. Ajoutez PARTITION BY afin que chaque produit ou magasin obtienne sa propre fenêtre mobile, sans débordement entre les groupes.
Le cadre et le tri s’appliquent indépendamment au sein de chaque partition, si bien que les premières lignes de chaque groupe commencent correctement leur propre phase d’initialisation.
SELECT
product_id,
sale_date,
AVG(amount) OVER (
PARTITION BY product_id
ORDER BY sale_date
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
) AS product_ma_7d
FROM daily_sales;Le lissage en pratique
Pourquoi s’en préoccuper ? Le chiffre d’affaires quotidien est irrégulier ; une moyenne mobile révèle la tendance. Une réponse courante d’analyste consiste à associer la valeur brute à sa courbe lissée afin que le tableau de bord affiche à la fois le signal et le bruit.
Vous pouvez également comparer une moyenne mobile courte et une moyenne mobile longue (par exemple 7 jours contre 30 jours) pour détecter la dynamique, l’équivalent SQL d’un croisement de moyennes mobiles.
SELECT
sale_date,
amount,
AVG(amount) OVER (ORDER BY sale_date
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS ma_7,
AVG(amount) OVER (ORDER BY sale_date
ROWS BETWEEN 29 PRECEDING AND CURRENT ROW) AS ma_30
FROM daily_sales;Liste de contrôle pour l’entretien
Pour réussir une question sur les moyennes mobiles, abordez les points suivants :
AVG OVER (ORDER BY ... ROWS BETWEEN n-1 PRECEDING AND CURRENT ROW).- Taille de la fenêtre = nombre de lignes précédentes + 1.
- Choix entre fenêtre rétrospective et centrée.
- Phase d’initialisation avec fenêtre partielle et manière de la supprimer.
ROWSetRANGElorsque des jours sont manquants.PARTITION BYpour réinitialiser le calcul par entité.
Vérification rapide
Choisissez le cadre pour une moyenne mobile rétrospective sur 7 jours calculée sur des lignes quotidiennes.
Récapitulatif : moyennes mobiles
Une moyenne mobile s’écrit AVG(value) OVER (ORDER BY ... ROWS BETWEEN n-1 PRECEDING AND CURRENT ROW), où la taille de la fenêtre correspond au nombre de lignes précédentes plus une. Choisissez une fenêtre rétrospective ou centrée selon le cas d’utilisation, gérez les lignes de mise en route avec une condition COUNT et passez à un intervalle RANGE lorsque les lacunes calendaires sont importantes.
Réinitialisez le calcul par entité avec PARTITION BY et réutilisez les cadres avec un WINDOW nommé. Nous allons maintenant transformer les sommes cumulées en pourcentages avec la part cumulée du total.
Questions Fréquemment Posées
La leçon « Moyennes mobiles sur une fenêtre glissante » est-elle gratuite ?
Oui — le texte complet de « Moyennes mobiles sur une fenêtre glissante » 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 Coding Interview Prep, passe à CoddyKit PRO. Le cours Coding Interview Prep comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Moyennes mobiles sur une fenêtre glissante » ?
Calculer des moyennes glissantes sur N périodes avec BETWEEN PRECEDING et CURRENT ROW Tu pratiques Coding 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 Coding Interview Prep ?
Aucune expérience préalable n'est requise. Coding 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 3 sur 4.
Combien de temps prend la leçon « Moyennes mobiles sur une fenêtre glissante » ?
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 Coding Interview Prep ?
Oui. Chaque leçon Coding 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
- Sommes cumulées avec les fenêtres
- Fenêtres ROWS ou RANGE
- Moyennes mobiles sur une fenêtre glissante
- Distribution cumulée et pourcentage du total