sql >> Databasteknik >  >> RDS >> PostgreSQL

Glidande medelvärde i 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

Det som är fel med OP:s fråga är ramspecifikationen:

ROWS BETWEEN 0 PRECEDING AND 2 FOLLOWING

Utöver det undviker min fråga onödig beräkning genom att filtrera torsdagar innan de dyra fönsterfunktionerna används.

Om det är nödvändigt att partitionera med shop_id, lägg uppenbarligen till partition by shop_id till båda funktionerna, avg och row_number .



  1. Skapa en pl/sql-funktion och hitta skottår

  2. JDBC batch operations förståelse

  3. Oracle.DataAccess.dll kan inte hittas även om det finns

  4. Python, MySQL _mysql_exceptions.ProgrammingError:(1064, 'Du har ett fel i din SQL-syntax