PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Gleitender Durchschnitt in postgresql

SQL-Geige

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

Was an der OP-Abfrage falsch ist, ist die Frame-Spezifikation:

ROWS BETWEEN 0 PRECEDING AND 2 FOLLOWING

Abgesehen davon vermeidet meine Abfrage unnötiges Rechnen, indem Donnerstage gefiltert werden, bevor die teuren Fensterfunktionen angewendet werden.

Wenn es notwendig ist, nach shop_id zu partitionieren, dann fügen Sie natürlich die partition by shop_id hinzu zu beiden Funktionen, avg und row_number .