PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Średnia ruchoma w postgresql

Skrzypce SQL

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

To, co jest nie tak z zapytaniem OP, to specyfikacja ramki:

ROWS BETWEEN 0 PRECEDING AND 2 FOLLOWING

Poza tym moje zapytanie pozwala uniknąć niepotrzebnych obliczeń, filtrując czwartki przed zastosowaniem kosztownych funkcji okna.

Jeśli konieczne jest partycjonowanie według shop_id, to oczywiście dodaj partition by shop_id do obu funkcji, avg i row_number .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak stworzyć użytkownika postgresql za pomocą tkaniny?

  2. Uzyskaj liczbę kluczy obcych z wielu tabel

  3. Jak używać zmiennych ustawień w funkcjach wyzwalaczy?

  4. Klucze podstawowe i obce w pgAdmin

  5. C# i PostgreSQL