sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man beräknar glidande medelvärde i PostgreSQL

Med glidande medelvärde eller rullande medelvärde kan du beräkna medelvärde över en rörlig tidsperiod, som de senaste 7 dagarna. Att beräkna glidande medelvärde över tid ger en jämnare trend, jämfört med att spåra dagliga siffror. Här är SQL-frågan för att beräkna glidande medelvärde i PostgreSQL.

Hur man beräknar glidande medelvärde i PostgreSQL

Så här beräknar du glidande medelvärde i PostgreSQL. Låt oss säga att du har följande tabell

postgres=# create table sales(order_date date,sale int);

postgres=# insert into sales values('2020-04-01',210),
           ('2020-04-02',125),('2020-04-03',150),('2020-04-04',230),
           ('2020-04-05',200),('2020-04-10',220),('2020-04-06',25),
           ('2020-04-07',215),('2020-04-08',300),('2020-04-09',250);

postgres=# select * from sales;
 order_date | sale
------------+------
 2020-04-01 |  210
 2020-04-02 |  125
 2020-04-03 |  150
 2020-04-04 |  230
 2020-04-05 |  200
 2020-04-10 |  220
 2020-04-06 |   25
 2020-04-07 |  215
 2020-04-08 |  300
 2020-04-09 |  250

Bonus Läs:Hur man importerar CSV-fil i PostgreSQL

Låt oss säga att du vill beräkna glidande medelvärde i PostgreSQL för de senaste 5 dagarna. PostgreSQL låter dig beräkna rullande medelvärde med hjälp av fönsterfunktioner. Här är frågan för att beräkna glidande medelvärde i PostgreSQL för de senaste 5 dagarna. Vi kommer att titta på det i detalj

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 ;
 order_date | sale |      avg_sales
------------+------+----------------------
 2020-04-01 |  210 | 210.00
 2020-04-02 |  125 | 167.50
 2020-04-03 |  150 | 161.66
 2020-04-04 |  230 | 178.75
 2020-04-05 |  200 | 183.00
 2020-04-06 |   25 | 146.00
 2020-04-07 |  215 | 164.00
 2020-04-08 |  300 | 194.00
 2020-04-09 |  250 | 198.00
 2020-04-10 |  220 | 202.00

I ovanstående fråga beräknar AVG-funktionen genomsnittsvärdet för försäljning kolumn. När vi använder den med Window-funktionen OVER, beräknar den endast medelvärdet för det tidsfönster som definierats av oss.

För att beräkna glidande medelvärde i PostgreSQL sorterar vi först raderna kronologiskt med hjälp av ORDER BY-satsen. Sedan definierar vi vårt fönster för beräkning av medelvärde, med hjälp av RADER MELLAN 4 FÖREGÅENDE OCH AKTUELLA RADER. Det betyder att för varje rad beräkna genomsnittet för endast den aktuella raden och föregående 4 rader. Så för varje rad beaktas endast de senaste 5 dagarnas värden.

Du kan också lägga till filter och avrundade medelvärden genom att lägga till WHERE-sats och ROUND-funktion 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;

Bonus Läs:Beräkna månad över månad tillväxt i PostgreSQL

Hur man beräknar 30-dagars glidande medelvärde i PostgreSQL

På liknande sätt, om du vill beräkna 30-dagars glidande medelvärde i PostgreSQL, kan du ändra ovanstående fråga genom att överväga 29 föregående rader och nuvarande rad

SELECT a.order_date,a.sale, 
       AVG(a.sale)
       OVER(ORDER BY a.order_date ROWS BETWEEN 29 PRECEDING AND CURRENT ROW)
       AS avg_sales
       FROM sales a ;

Hur man beräknar 3-månaders glidande medelvärde i PostgreSQL

Om du har dagliga försäljningsdata och vill beräkna 3-månaders glidande medelvärde i PostgreSQL, kan du ändra ovanstående fråga genom att överväga 89 föregående rader och nuvarande rad

SELECT a.order_date,a.sale, 
       AVG(a.sale)
       OVER(ORDER BY a.order_date ROWS BETWEEN 89 PRECEDING AND CURRENT ROW)
       AS avg_sales
       FROM sales a ;

Låt oss säga att du har månadsdata istället för dagliga data och vill beräkna rullande medelvärde för de senaste tre månaderna

postgres=# create table monthly_sales(order_month date,sale int);

postgres=# insert into monthly_sales values('2019-12-01',120),
           ('2020-01-30',250),('2020-02-28',150),('2020-03-31',300),
           ('2020-04-30',200),('2020-05-31',200),('2020-06-30',250),
           ('2020-07-31',150),('2020-08-31',300),('2020-09-30',200);

postgres=# select * from monthly_sales;
 order_month | sale
-------------+------
 2019-12-01  |  120
 2020-01-30  |  250
 2020-02-28  |  150
 2020-03-31  |  300
 2020-04-30  |  200
 2020-05-31  |  200
 2020-06-30  |  250
 2020-07-31  |  150
 2020-08-31  |  300
 2020-09-30  |  200

Bonusläs:Hur man beräknar retentionsgrad i SQL

Vi använder samma logik som ovan, för att beräkna rullande medelvärde i PostgreSQL. Först sorterar vi rader kronologiskt och använder sedan funktionen OVER-fönster för att beräkna genomsnittet för föregående 2 rader och aktuell rad .

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  |  120 |    120.00
 2020-01-30  |  250 |    185.00
 2020-02-28  |  150 |    173.33
 2020-03-31  |  300 |    233.33
 2020-04-30  |  200 |    216.67
 2020-05-31  |  200 |    233.33
 2020-06-30  |  250 |    216.67
 2020-07-31  |  150 |    200.00
 2020-08-31  |  300 |    233.33
 2020-09-30  |  200 |    216.67

Bonus Läs:Hur man skapar pivottabell i PostgreSQL

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 PostgreSQL, enligt dina krav.

När du har beräknat glidande medelvärde i PostgreSQL kan du använda ett diagramverktyg för att plotta 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 PostgreSQL-databasen kan du prova Ubiq. Vi erbjuder en 14-dagars gratis provperiod.


  1. När eller varför ska man använda en SET DEFINE OFF i Oracle Database

  2. serie i postgres ökar även om jag har lagt till på konflikt gör ingenting

  3. Hur programmerar man en MySQL-utlösare för att infoga rad i en annan tabell?

  4. VÄNSTER JOIN endast första raden