sql >> Base de Datos >  >> RDS >> PostgreSQL

Media móvil en 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

Lo que está mal con la consulta del OP es la especificación del marco:

ROWS BETWEEN 0 PRECEDING AND 2 FOLLOWING

Aparte de eso, mi consulta evita la computación innecesaria al filtrar los jueves antes de aplicar las costosas funciones de ventana.

Si es necesario particionar por shop_id, obviamente agregue la partición partition by shop_id a ambas funciones, avg y row_number .