PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Média móvel no postgresql


SQL Fiddle
select
    "date",
    shop_id,
    amount,
    extract(dow from date),
    case when
        row_number() over (order by date) > 3
        then
            avg(amount) OVER (
                ORDER BY date DESC
                ROWS BETWEEN 1 following AND 3 FOLLOWING
            )
        else null end
from (
    select *
    from ro
    where extract(dow from date) = 4
) s

O que há de errado com a consulta do OP é a especificação do quadro:
ROWS BETWEEN 0 PRECEDING AND 2 FOLLOWING

Fora isso, minha consulta evita computação desnecessária filtrando as quintas-feiras antes de aplicar as caras funções da janela.

Se for necessário particionar por shop_id, obviamente adicione a partition by shop_id para ambas as funções, avg e row_number .