sql >> Databasteknik >  >> RDS >> Database

Hur man beräknar glidande medelvärde i rödförskjutning

Rullande medelvärde eller glidande medelvärde är ett användbart mätvärde som hjälper dig att hålla reda på genomsnittsvärdet under en rörlig period (t.ex. genomsnittlig försäljning under de senaste 7 dagarna). Att beräkna glidande medelvärde över tid ger mer rimlig trend, jämfört med att plotta dagliga tal. Eftersom det inte finns någon inbyggd funktion för att beräkna glidande medelvärde i Redshift, här är SQL-frågan för att göra det.

Hur man beräknar glidande medelvärde i rödförskjutning

Här är stegen för att beräkna glidande medelvärde i Redshift. Låt oss säga att du har följande tabell som innehåller daglig försäljningsinformation 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 |
+------------+------+

Låt oss säga att du vill beräkna glidande medelvärde i Redshift för de senaste 5 dagarna. Redshift (som i grunden är Postgresql) gör detta väldigt enkelt med hjälp av Redshift Window Functions. Här är SQL-frågan för att beräkna glidande medelvärde för de senaste 5 dagarna. Vi kommer att titta på det i detalj nedan.

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 ;

Om du vill avrunda resultaten kan du använda ROUND-funktionen som visas för att beräkna löpande medelvärde i 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

Låt oss titta på ovanstående fråga i detalj. AVG-funktionen beräknar genomsnittsvärdet för försäljning kolumn. Men när vi använder den tillsammans med WINDOW-funktionen OVER, beräknar den endast medelvärdet för det fönster som vi definierar.

Först använder vi ORDER BY på våra data för att säkerställa att raderna sorteras kronologiskt. Sedan definierar vi vårt fönster för medelvärde med funktionen OVER, och nämner RADER MELLAN 4 FÖREGÅENDE OCH AKTUELLA RADER. Det vill säga för varje rad, beräkna medelvärdet för föregående 4 rader och nuvarande rad. Eftersom fönsterramen ändras för varje rad kommer endast föregående 4 dagar och aktuellt datum att användas.

Du kan också lägga till filter genom att lägga till WHERE-satsen i SQL-frågan ovan.

 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;

Om du vill beräkna glidande medelvärde i rödförskjutning för de senaste 30 dagarna/1 månaden, ändra ovanstående fråga för att använda FÖREGÅENDE 29 RADER OCH AKTUELL RADER

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äsning: Hur man skapar pivottabell i PostgreSQL

Hur man beräknar glidande medelvärde i rödförskjutning för de senaste 3 månaderna

Anta att du har månadsförsäljningsdata istället för dagliga data och vill beräkna rullande medelvärde för de senaste tre månaderna.

# 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 använder samma logik för att beräkna glidande medelvärde i Redshift, i det här fallet. Första BESTÄLLNING AV order_månad kolumn för att säkerställa att raderna är kronologiskt sorterade. Beräkna sedan genomsnittet för FÖREGÅENDE 2 RADER OCH NUVARANDE RADER

 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 Läs: Hur man beräknar löpande totalsumma i rödförskjutning

Du kan också lägga till filter genom att inkludera WHERE-satsen i SQL-frågan ovan.

 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 anpassa frågan ovan för att beräkna glidande medelvärde i Redshift, enligt dina krav.

När du har beräknat glidande medelvärde i Redshift, kan du använda ett diagramverktyg för att rita det på ett linjediagram och dela det med ditt team. Här är ett exempel på ett linjediagram som visualiserar glidande medelvärde, skapat med Ubiq.

Om du vill skapa diagram, instrumentpaneler och rapporter från Redshift-databasen kan du prova Ubiq. Vi erbjuder en 14-dagars gratis provperiod.

  1. Hur man returnerar alla inaktiverade främmande nyckelbegränsningar i SQL Server (T-SQL-exempel)

  2. Lagring av UTF-16/Unicode-data i SQL Server

  3. Referens:Vad är ett perfekt kodexempel med MySQL-tillägget?

  4. Oracle:skillnad mellan max(id)+1 och sequence.nextval