Het voortschrijdend gemiddelde of voortschrijdend gemiddelde is een nuttige statistiek waarmee u de gemiddelde waarde over een bewegende periode kunt bijhouden (bijvoorbeeld de gemiddelde verkoop van de afgelopen 7 dagen). Het berekenen van het voortschrijdend gemiddelde in de tijd geeft een meer redelijke trend, vergeleken met het plotten van dagelijkse cijfers. Aangezien er geen ingebouwde functie is om voortschrijdend gemiddelde te berekenen in Redshift, volgt hier de SQL-query om dit te doen.
Hoe het voortschrijdend gemiddelde in roodverschuiving te berekenen
Hier zijn de stappen om het voortschrijdend gemiddelde in Roodverschuiving te berekenen. Stel dat u de volgende tabel heeft met dagelijkse verkoopinformatie 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 | +------------+------+
Stel dat u het voortschrijdend gemiddelde van de afgelopen 5 dagen in Redshift wilt berekenen. Redshift (wat eigenlijk Postgresql is) maakt dit heel gemakkelijk met behulp van Redshift Window Functions. Hier is de SQL-query om het voortschrijdend gemiddelde van de afgelopen 5 dagen te berekenen. We zullen het hieronder in detail bekijken.
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 ;
Als u de resultaten wilt afronden, kunt u de ROUND-functie gebruiken zoals weergegeven om het voortschrijdend gemiddelde in Roodverschuiving te berekenen
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
Laten we de bovenstaande vraag in detail bekijken. AVG-functie berekent gemiddelde waarde van verkoop kolom. Wanneer we het echter samen met de VENSTER-functie OVER gebruiken, berekent het alleen de gemiddelde waarde voor het venster dat we definiëren.
Eerst gebruiken we ORDER BY voor onze gegevens om ervoor te zorgen dat rijen chronologisch worden gesorteerd. Vervolgens definiëren we ons venster voor het gemiddelde met behulp van de OVER-functie en vermelden we RIJEN TUSSEN 4 VOORGAANDE EN HUIDIGE RIJ. Dat wil zeggen, bereken voor elke rij het gemiddelde van de voorgaande 4 rijen en de huidige rij. Aangezien het raamkozijn voor elke rij verandert, worden alleen de voorgaande 4 dagen en de huidige datum gebruikt.
U kunt ook filters toevoegen door de WHERE-component toe te voegen aan de bovenstaande SQL-query.
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;
Als u het voortschrijdend gemiddelde in Redshift voor de afgelopen 30 dagen/1 maand wilt berekenen, wijzigt u de bovenstaande zoekopdracht in VORIGE 29 RIJEN EN HUIDIGE RIJ
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 lezen: Hoe een draaitabel in PostgreSQL te maken
Hoe het voortschrijdend gemiddelde in roodverschuiving voor de afgelopen 3 maanden te berekenen
Stel dat u maandelijkse verkoopgegevens heeft in plaats van dagelijkse gegevens en dat u het voortschrijdend gemiddelde van de afgelopen 3 maanden wilt berekenen.
# 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
In dit geval gebruiken we dezelfde logica om het voortschrijdend gemiddelde in Roodverschuiving te berekenen. Eerste BESTELLING PER order_maand kolom om ervoor te zorgen dat de rijen chronologisch worden gesorteerd. Bereken vervolgens het gemiddelde voor VOORGAANDE 2 RIJEN EN HUIDIGE RIJ
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 lezen: Hoe bereken je het lopende totaal in Redshift
U kunt ook filters toevoegen door de WHERE-clausule op te nemen in de bovenstaande SQL-query.
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;
U kunt de bovenstaande zoekopdracht aanpassen om het voortschrijdend gemiddelde in Redshift te berekenen, volgens uw vereisten.
Nadat u het voortschrijdend gemiddelde in Redshift hebt berekend, kunt u een grafiektool gebruiken om het in een lijndiagram uit te zetten en met uw team te delen. Hier is een voorbeeld van een lijndiagram dat voortschrijdend gemiddelde visualiseert, gemaakt met Ubiq.
Als u grafieken, dashboards en rapporten wilt maken vanuit de Redshift-database, kunt u Ubiq proberen. We bieden een gratis proefperiode van 14 dagen aan.