sql >> Databáze >  >> RDS >> Database

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

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.

  1. Pochopení indexů v MySQL:Část první

  2. Rozdíl mezi databází a schématem

  3. Problémy s příkazem postgresql COPY s Rails na jiném serveru

  4. Jak zkontrolovat maximální počet povolených připojení k databázi Oracle?