sql >> Databáze >  >> RDS >> PostgreSQL

Jak vypočítat klouzavý průměr v PostgreSQL

Klouzavý průměr nebo klouzavý průměr umožňuje vypočítat průměr za klouzavé časové období, jako je posledních 7 dní. Výpočet klouzavého průměru v průběhu času poskytuje hladší trend ve srovnání se sledováním denních čísel. Zde je dotaz SQL pro výpočet klouzavého průměru v PostgreSQL.

Jak vypočítat klouzavý průměr v PostgreSQL

Zde je návod, jak vypočítat klouzavý průměr v PostgreSQL. Řekněme, že máte následující tabulku

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

Bonusové čtení:Jak importovat soubor CSV v PostgreSQL

Řekněme, že chcete vypočítat klouzavý průměr v PostgreSQL za posledních 5 dní. PostgreSQL vám umožňuje vypočítat klouzavý průměr pomocí funkcí okna. Zde je dotaz na výpočet klouzavého průměru v PostgreSQL za posledních 5 dní. Podíváme se na to podrobně

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

Ve výše uvedeném dotazu funkce AVG vypočítá průměrnou hodnotu prodeje sloupec. Když ji použijeme s funkcí Window OVER, vypočítá průměr pouze pro námi definované časové okno.

Pro výpočet klouzavého průměru v PostgreSQL nejprve seřadíme řádky chronologicky pomocí klauzule ORDER BY. Poté definujeme naše okno pro výpočet průměru pomocí ŘÁDKŮ MEZI 4 PŘEDCHOZÍMI A AKTUÁLNÍMI ŘÁDKY. To znamená, že pro každý řádek vypočítat průměr pouze pro aktuální řádek a předchozí 4 řádky. Pro každý řádek se tedy berou v úvahu pouze hodnoty za posledních 5 dní.

Můžete také přidat filtry a zaokrouhlit průměrné hodnoty přidáním klauzule WHERE a funkce ROUND do výše uvedeného SQL dotazu.

 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;

Bonusové čtení:Výpočet měsíčního růstu v PostgreSQL

Jak vypočítat 30denní klouzavý průměr v PostgreSQL

Podobně, pokud chcete vypočítat 30denní klouzavý průměr v PostgreSQL, můžete upravit výše uvedený dotaz tím, že vezmete v úvahu 29 předchozích řádků a aktuální řádek

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 ;

Jak vypočítat 3měsíční klouzavý průměr v PostgreSQL

Pokud máte údaje o denním prodeji a chcete vypočítat 3měsíční klouzavý průměr v PostgreSQL, můžete upravit výše uvedený dotaz tím, že vezmete v úvahu 89 předchozích řádků a aktuální řádek

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 ;

Řekněme, že máte měsíční údaje místo denních údajů a chcete vypočítat klouzavý průměr za poslední 3 měsíce

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

Bonusové čtení:Jak vypočítat míru retence v SQL

Pro výpočet klouzavého průměru v PostgreSQL používáme stejnou logiku jako výše. Nejprve seřadíme řádky chronologicky a poté pomocí funkce OVER window vypočítáme průměr pro před 2 řádky a aktuální řádek .

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

Bonusové čtení:Jak vytvořit kontingenční tabulku v PostgreSQL

Můžete také přidat filtry zahrnutím klauzule WHERE do výše uvedeného SQL dotazu.

 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;

Výše uvedený dotaz můžete upravit tak, aby vypočítal klouzavý průměr v PostgreSQL, podle vašich požadavků.

Poté, co vypočítáte klouzavý průměr v PostgreSQL, můžete jej pomocí nástroje pro vytváření grafů vykreslit do spojnicového grafu a sdílet jej se svým týmem. Zde je příklad spojnicového grafu, který zobrazuje klouzavý průměr, vytvořeného pomocí Ubiq.

Pokud chcete vytvářet grafy, dashboardy a sestavy z databáze PostgreSQL, můžete zkusit Ubiq. Nabízíme 14denní bezplatnou zkušební verzi.


  1. Jak generovat příkazy vložení z textových souborů pro tabulku SQL Server v SQL Server - SQL Server / Výukový program TSQL, část 106

  2. Jak se spouštějí paralelní plány – část 3

  3. .další problém s vložením JDBC

  4. dplyr left_join o méně než, větší než podmínka