Rullende gennemsnit eller glidende gennemsnit er en nyttig metrik, der hjælper dig med at holde styr på gennemsnitsværdien over en glidende periode (f.eks. gennemsnitligt salg for de seneste 7 dage). Beregning af glidende gennemsnit over tid giver en mere fornuftig tendens sammenlignet med at plotte daglige tal. Da der ikke er nogen indbygget funktion til at beregne glidende gennemsnit i Redshift, er her SQL-forespørgslen til at gøre det.
Sådan beregnes glidende gennemsnit i rødforskydning
Her er trinene til at beregne glidende gennemsnit i rødforskydning. Lad os sige, at du har følgende tabel, der indeholder daglige salgsoplysninger i 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 | +------------+------+
Lad os sige, at du vil beregne glidende gennemsnit i rødforskydning for de seneste 5 dage. Redshift (som dybest set er Postgresql) gør dette virkelig nemt ved hjælp af Redshift Window Functions. Her er SQL-forespørgslen til at beregne glidende gennemsnit for de seneste 5 dage. Vi vil se nærmere på det nedenfor.
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 ;
Hvis du vil runde resultaterne, kan du bruge RUND-funktionen som vist til at beregne løbende gennemsnit i rødforskydning
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
Lad os se på ovenstående forespørgsel i detaljer. AVG-funktionen beregner gennemsnitsværdien af salg kolonne. Men når vi bruger det sammen med WINDOW-funktionen OVER, beregner det kun gennemsnitsværdien for det vindue, vi definerer.
Først bruger vi ORDER BY på vores data for at sikre, at rækker sorteres kronologisk. Derefter definerer vi vores vindue for gennemsnit ved hjælp af OVER-funktionen, og nævner RÆKKER MELLEM 4 FOREGÅENDE OG AKTUELLE RÆKKE. Det vil sige, for hver række beregnes gennemsnittet for de foregående 4 rækker og den aktuelle række. Da vinduesrammen ændres for hver række, vil kun de foregående 4 dage og den aktuelle dato blive brugt.
Du kan også tilføje filtre ved at tilføje WHERE-sætning i ovenstående SQL-forespørgsel.
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;
Hvis du vil beregne glidende gennemsnit i rødforskydning for de seneste 30 dage/1 måned, skal du ændre ovenstående forespørgsel til at bruge FORUDSTEDENDE 29 RÆKKER OG NUVÆRENDE RÆKKER
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;
Bonuslæser: Sådan opretter du pivottabel i PostgreSQL
Sådan beregnes glidende gennemsnit i rødforskydning for de seneste 3 måneder
Lad os sige, at du har månedlige salgsdata i stedet for daglige data og ønsker at beregne rullende gennemsnit for de seneste 3 måneder.
# 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
Vi bruger den samme logik til at beregne glidende gennemsnit i Redshift, i dette tilfælde. Første BESTILLING AF ordre_month kolonne for at sikre, at rækkerne er kronologisk sorteret. Beregn derefter gennemsnit for FORUDSTEDENDE 2 RÆKKER OG NUVÆRENDE RÆKKE
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
Bonuslæser: Sådan beregner du løbende total i rødforskydning
Du kan også tilføje filtre ved at inkludere WHERE-sætning i ovenstående SQL-forespørgsel.
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;
Du kan tilpasse ovenstående forespørgsel til at beregne glidende gennemsnit i rødforskydning i henhold til dine krav.
Når du har beregnet glidende gennemsnit i Redshift, kan du bruge et diagramværktøj til at plotte det på et linjediagram og dele det med dit team. Her er et eksempel på et linjediagram, der visualiserer glidende gennemsnit, oprettet ved hjælp af Ubiq.
Hvis du vil oprette diagrammer, dashboards og rapporter fra Redshift-databasen, kan du prøve Ubiq. Vi tilbyder en 14-dages gratis prøveperiode.