Klouzavý průměr nebo klouzavý průměr je užitečná metrika, která vám pomáhá sledovat průměrnou hodnotu za pohyblivé období (např. průměrné prodeje za posledních 7 dní). Výpočet klouzavého průměru v průběhu času poskytuje rozumnější trend ve srovnání s vykreslováním denních čísel. Vzhledem k tomu, že v Redshift není žádná vestavěná funkce pro výpočet klouzavého průměru, zde je SQL dotaz, jak to udělat.
Jak vypočítat klouzavý průměr v Redshift
Zde jsou kroky pro výpočet klouzavého průměru v Redshift. Řekněme, že máte následující tabulku, která obsahuje informace o denním prodeji v 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 | +------------+------+
Řekněme, že chcete vypočítat klouzavý průměr v Redshift za posledních 5 dní. Redshift (což je v podstatě Postgresql) to opravdu usnadňuje pomocí funkcí Redshift Window Functions. Zde je dotaz SQL pro výpočet klouzavého průměru za posledních 5 dní. Níže se na to podíváme 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 ;
Pokud chcete výsledky zaokrouhlit, můžete použít funkci ROUND, jak je znázorněno, pro výpočet průběžného průměru v 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
Podívejme se na výše uvedený dotaz podrobně. Funkce AVG vypočítá průměrnou hodnotu prodeje sloupec. Když ji však použijeme spolu s funkcí WINDOW OVER, vypočítá průměrnou hodnotu pouze pro okno, které definujeme.
Nejprve použijeme ORDER BY na našich datech, abychom zajistili, že řádky budou seřazeny chronologicky. Poté definujeme naše okno pro průměr pomocí funkce OVER a zmíníme ŘÁDKY MEZI 4 PŘEDCHOZÍM A AKTUÁLNÍM ŘÁDKEM. To znamená, že pro každý řádek vypočítejte průměr za předchozí 4 řádky a aktuální řádek. Jak se rám okna mění pro každý řádek, použijí se pouze předchozí 4 dny a aktuální datum.
Můžete také přidat filtry přidáním klauzule WHERE 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;
Pokud chcete vypočítat klouzavý průměr v Redshift za posledních 30 dní/1 měsíc, upravte výše uvedený dotaz tak, aby používal PŘEDCHOZÍCH 29 ŘÁDKŮ A AKTUÁLNÍ ŘÁDEK
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;
Bonusové čtení: Jak vytvořit kontingenční tabulku v PostgreSQL
Jak vypočítat klouzavý průměr v červeném posuvu za poslední 3 měsíce
Řekněme, že máte měsíční údaje o prodeji místo denních údajů a chcete vypočítat klouzavý průměr za poslední 3 měsíce.
# 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
V tomto případě používáme stejnou logiku pro výpočet klouzavého průměru v Redshift. První OBJEDNÁVKA DO měsíc_objednávky sloupec, abyste zajistili chronologické řazení řádků. Poté vypočítejte průměr pro PŘEDCHOZÍ 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 | 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
Bonusové čtení: Jak vypočítat průběžný součet v Redshift
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 Redshift, podle vašich požadavků.
Poté, co vypočítáte klouzavý průměr v Redshift, 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ý pomocí Ubiq.
Pokud chcete vytvářet grafy, dashboardy a sestavy z databáze Redshift, můžete zkusit Ubiq. Nabízíme 14denní bezplatnou zkušební verzi.