La media mobile o la media mobile è una metrica utile che ti aiuta a tenere traccia del valore medio su un periodo mobile (ad esempio, le vendite medie degli ultimi 7 giorni). Il calcolo della media mobile nel tempo fornisce una tendenza più ragionevole rispetto alla tracciatura dei numeri giornalieri. Poiché non esiste una funzione integrata per calcolare la media mobile in Redshift, ecco la query SQL per farlo.
Come calcolare la media mobile in Redshift
Ecco i passaggi per calcolare la media mobile in Redshift. Supponiamo che tu abbia la seguente tabella che contiene informazioni sulle vendite giornaliere in 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 | +------------+------+
Supponiamo che tu voglia calcolare la media mobile in Redshift negli ultimi 5 giorni. Redshift (che è fondamentalmente Postgresql) lo rende davvero facile con l'aiuto delle funzioni della finestra Redshift. Ecco la query SQL per calcolare la media mobile degli ultimi 5 giorni. Lo esamineremo in dettaglio di seguito.
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 ;
Se desideri arrotondare i risultati, puoi utilizzare la funzione ROUND come mostrato per calcolare la media corrente in 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
Diamo un'occhiata alla query di cui sopra in dettaglio. La funzione AVG calcola il valore medio di vendita colonna. Tuttavia, quando lo utilizziamo insieme alla funzione WINDOW OVER, calcola il valore medio solo per la finestra che definiamo.
Per prima cosa utilizziamo ORDER BY sui nostri dati per garantire che le righe siano ordinate cronologicamente. Quindi definiamo la nostra finestra per la media usando la funzione OVER e menzioniamo le RIGHE TRA 4 PRECEDENTI E LA RIGA CORRENTE. Cioè, per ogni riga, calcola la media delle 4 righe precedenti e della riga corrente. Poiché la cornice della finestra cambia per ogni riga, verranno utilizzati solo i 4 giorni precedenti e la data corrente.
Puoi anche aggiungere filtri aggiungendo la clausola WHERE nella query SQL precedente.
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;
Se desideri calcolare la media mobile in Redshift per gli ultimi 30 giorni/1 mese, modifica la query precedente per utilizzare 29 RIGHE PRECEDENTI E RIGA ATTUALE
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;
Bonus Leggi: Come creare una tabella pivot in PostgreSQL
Come calcolare la media mobile in Redshift negli ultimi 3 mesi
Supponiamo che tu disponga di dati sulle vendite mensili anziché giornalieri e desideri calcolare la media mobile degli ultimi 3 mesi.
# 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
Usiamo la stessa logica per calcolare la media mobile in Redshift, in questo caso. Primo ORDINE PER ordine_mese colonna per garantire che le righe siano ordinate cronologicamente. Quindi calcola la media per 2 RIGHE PRECEDENTI E LA RIGA ATTUALE
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
Bonus Leggi: Come calcolare il totale parziale in Redshift
Puoi anche aggiungere filtri includendo la clausola WHERE nella query SQL precedente.
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;
Puoi personalizzare la query sopra per calcolare la media mobile in Redshift, secondo le tue esigenze.
Dopo aver calcolato la media mobile in Redshift, puoi utilizzare uno strumento di creazione di grafici per tracciarla su un grafico a linee e condividerla con il tuo team. Ecco un esempio di grafico a linee che visualizza la media mobile, creato utilizzando Ubiq.
Se vuoi creare grafici, dashboard e report dal database Redshift, puoi provare Ubiq. Offriamo una prova gratuita di 14 giorni.