Database
 sql >> Base de Dados >  >> RDS >> Database

Como calcular a média móvel no Redshift


A média móvel ou média móvel é uma métrica útil que ajuda a acompanhar o valor médio em um período móvel (por exemplo, vendas médias nos últimos 7 dias). O cálculo da média móvel ao longo do tempo fornece uma tendência mais razoável, em comparação com a plotagem de números diários. Como não há função interna para calcular a média móvel no Redshift, aqui está a consulta SQL para fazer isso.


Como calcular a média móvel no Redshift


Aqui estão as etapas para calcular a média móvel no Redshift. Digamos que você tenha a tabela a seguir que contém informações de vendas diárias no 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 |
+------------+------+

Digamos que você queira calcular a média móvel no Redshift dos últimos 5 dias. O Redshift (que é basicamente o Postgresql) torna isso muito fácil com a ajuda do Redshift Window Functions. Aqui está a consulta SQL para calcular a média móvel dos últimos 5 dias. Veremos isso em detalhes a seguir.
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 ;

Se você quiser arredondar os resultados, você pode usar a função ROUND conforme mostrado para calcular a média de corrida no 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

Vejamos a consulta acima em detalhes. A função AVG calcula o valor médio de venda coluna. No entanto, quando a usamos junto com a função WINDOW OVER ela calcula o valor médio apenas para a janela que definimos.

Primeiro, usamos ORDER BY em nossos dados para garantir que as linhas sejam classificadas cronologicamente. Em seguida, definimos nossa janela para a média usando a função OVER e mencionamos ROWS BETWEEN 4 PRECEDING AND CURRENT ROW. Ou seja, para cada linha, calcule a média das 4 linhas anteriores e da linha atual. À medida que o quadro da janela muda para cada linha, apenas os 4 dias anteriores e a data atual serão usados.

Você também pode adicionar filtros adicionando a cláusula WHERE na consulta SQL acima.
 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;



Se você deseja calcular a média móvel no Redshift nos últimos 30 dias/1 mês, modifique a consulta acima para usar PRECEDING 29 ROWS AND CURRENT ROW
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;



Bônus de leitura: Como criar uma tabela dinâmica no PostgreSQL


Como calcular a média móvel no Redshift nos últimos 3 meses


Digamos que você tenha dados de vendas mensais em vez de dados diários e queira calcular a média móvel dos últimos 3 meses.
# 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

Usamos a mesma lógica para calcular a média móvel no Redshift, neste caso. Primeiro ORDER BY order_month coluna para garantir que as linhas sejam classificadas cronologicamente. Em seguida, calcule a média para 2 LINHAS ANTERIORES E LINHA ATUAL
 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



Bônus de leitura: Como calcular o total em execução no Redshift



Você também pode adicionar filtros incluindo a cláusula WHERE na consulta SQL acima.
 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;

Você pode personalizar a consulta acima para calcular a média móvel no Redshift, conforme suas necessidades.

Depois de calcular a média móvel no Redshift, você pode usar uma ferramenta de gráficos para plotá-la em um gráfico de linhas e compartilhá-la com sua equipe. Aqui está um exemplo de um gráfico de linhas que visualiza a média móvel, criado usando o Ubiq.





Se você deseja criar gráficos, painéis e relatórios do banco de dados Redshift, experimente o Ubiq. Oferecemos um teste gratuito de 14 dias.