La moyenne mobile ou la moyenne mobile est une mesure utile qui vous aide à suivre la valeur moyenne sur une période mobile (par exemple, les ventes moyennes des 7 derniers jours). Le calcul de la moyenne mobile dans le temps donne une tendance plus raisonnable, par rapport au traçage des nombres quotidiens. Puisqu'il n'y a pas de fonction intégrée pour calculer la moyenne mobile dans Redshift, voici la requête SQL pour le faire.
Comment calculer la moyenne mobile dans Redshift
Voici les étapes pour calculer la moyenne mobile dans Redshift. Supposons que vous disposiez du tableau suivant contenant des informations sur les ventes quotidiennes dans Redshift.
# create table sales(order_date date,sale int); # insert into sales values('2020-01-01',20), ('2020-01-02',25),('2020-01-03',15),('2020-01-04',30), ('2020-01-05',20),('2020-01-10',20),('2020-01-06',25), ('2020-01-07',15),('2020-01-08',30),('2020-01-09',20); # select * from sales; +------------+------+ | order_date | sale | +------------+------+ | 2020-01-01 | 20 | | 2020-01-02 | 25 | | 2020-01-03 | 15 | | 2020-01-04 | 30 | | 2020-01-05 | 20 | | 2020-01-10 | 20 | | 2020-01-06 | 25 | | 2020-01-07 | 15 | | 2020-01-08 | 30 | | 2020-01-09 | 20 | +------------+------+
Disons que vous voulez calculer la moyenne mobile dans Redshift pour les 5 derniers jours. Redshift (qui est essentiellement Postgresql) rend cela vraiment facile avec l'aide des fonctions de fenêtre Redshift. Voici la requête SQL pour calculer la moyenne mobile des 5 derniers jours. Nous allons l'examiner en détail ci-dessous.
SELECT a.order_date,a.sale, AVG(a.sale) OVER(ORDER BY a.order_date ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) AS avg_sales FROM sales a ;
Si vous souhaitez arrondir les résultats, vous pouvez utiliser la fonction ROUND comme indiqué pour calculer la moyenne mobile dans Redshift
SELECT a.order_date,a.sale, round(AVG(a.sale) OVER(ORDER BY a.order_date ROWS BETWEEN 4 PRECEDING AND CURRENT ROW),2) AS avg_sales FROM sales a; order_date | sale | avg_sales ------------+------+--------------- 2020-01-01 | 20 | 20.00 2020-01-02 | 25 | 22.50 2020-01-03 | 15 | 20.00 2020-01-04 | 30 | 22.50 2020-01-05 | 20 | 22.00 2020-01-06 | 25 | 23.00 2020-01-07 | 15 | 21.00 2020-01-08 | 30 | 24.00 2020-01-09 | 20 | 22.00 2020-01-10 | 20 | 22.00
Examinons en détail la requête ci-dessus. La fonction AVG calcule la valeur moyenne de la vente colonne. Cependant, lorsque nous l'utilisons avec la fonction WINDOW OVER, il calcule la valeur moyenne uniquement pour la fenêtre que nous définissons.
Nous utilisons d'abord ORDER BY sur nos données pour nous assurer que les lignes sont triées par ordre chronologique. Ensuite, nous définissons notre fenêtre pour la moyenne à l'aide de la fonction OVER et mentionnons ROWS BETWEEN 4 PRECEDING AND CURRENT ROW. Autrement dit, pour chaque ligne, calculez la moyenne des 4 lignes précédentes et de la ligne actuelle. Comme le cadre de la fenêtre change pour chaque ligne, seuls les 4 jours précédents et la date actuelle seront utilisés.
Vous pouvez également ajouter des filtres en ajoutant la clause WHERE dans la requête SQL ci-dessus.
SELECT a.order_date,a.sale, round(AVG(a.sale) OVER(ORDER BY a.order_date ROWS BETWEEN 4 PRECEDING AND CURRENT ROW),2) AS avg_sales FROM sales a WHERE condition;
Si vous souhaitez calculer la moyenne mobile dans Redshift pour les 30 derniers jours/1 mois, modifiez la requête ci-dessus pour utiliser PRECEDING 29 ROWS AND CURRENT ROW
SELECT a.order_date,a.sale, round(AVG(a.sale) OVER(ORDER BY a.order_date ROWS BETWEEN 29 PRECEDING AND CURRENT ROW),2) AS avg_sales FROM sales a;
Lecture bonus : Comment créer un tableau croisé dynamique dans PostgreSQL
Comment calculer la moyenne mobile dans Redshift pour les 3 derniers mois
Supposons que vous disposiez de données de ventes mensuelles au lieu de données quotidiennes et que vous souhaitiez calculer la moyenne mobile des 3 derniers mois.
# create table monthly_sales(order_month date,sale int); postgres=# insert into monthly_sales values('2019-12-01',20), ('2020-01-30',25),('2020-02-28',15),('2020-03-31',30), ('2020-04-30',20),('2020-05-31',20),('2020-06-30',25), ('2020-07-31',15),('2020-08-31',30),('2020-09-30',20); postgres=# select * from monthly_sales; order_month | sale -------------+------ 2019-12-01 | 20 2020-01-30 | 25 2020-02-28 | 15 2020-03-31 | 30 2020-04-30 | 20 2020-05-31 | 20 2020-06-30 | 25 2020-07-31 | 15 2020-08-31 | 30 2020-09-30 | 20
Nous utilisons la même logique pour calculer la moyenne mobile dans Redshift, dans ce cas. Première COMMANDE PAR mois_commande colonne pour s'assurer que les lignes sont triées par ordre chronologique. Calculez ensuite la moyenne pour LES 2 LIGNES PRÉCÉDENTES ET LA LIGNE ACTUELLE
SELECT a.order_month,a.sale, round(AVG(a.sale) OVER(ORDER BY a.order_month ROWS BETWEEN 2 PRECEDING AND CURRENT ROW),2) AS avg_sales FROM monthly_sales a ; order_month | sale | avg_sales -------------+------+----------- 2019-12-01 | 20 | 20.00 2020-01-30 | 25 | 22.50 2020-02-28 | 15 | 20.00 2020-03-31 | 30 | 23.33 2020-04-30 | 20 | 21.67 2020-05-31 | 20 | 23.33 2020-06-30 | 25 | 21.67 2020-07-31 | 15 | 20.00 2020-08-31 | 30 | 23.33 2020-09-30 | 20 | 21.67
Lecture bonus : Comment calculer le total cumulé dans Redshift
Vous pouvez également ajouter des filtres en incluant la clause WHERE dans la requête SQL ci-dessus.
SELECT a.order_month,a.sale, round(AVG(a.sale) OVER(ORDER BY a.order_month ROWS BETWEEN 2 PRECEDING AND CURRENT ROW),2) AS avg_sales FROM monthly_sales a WHERE condition;
Vous pouvez personnaliser la requête ci-dessus pour calculer la moyenne mobile dans Redshift, selon vos besoins.
Après avoir calculé la moyenne mobile dans Redshift, vous pouvez utiliser un outil graphique pour la tracer sur un graphique linéaire et la partager avec votre équipe. Voici un exemple de graphique linéaire qui visualise la moyenne mobile, créé à l'aide d'Ubiq.
Si vous souhaitez créer des graphiques, des tableaux de bord et des rapports à partir de la base de données Redshift, vous pouvez essayer Ubiq. Nous offrons un essai gratuit de 14 jours.