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.