2016-04-05 5 views
0

Meine Quelldaten enthält Transaktions-ID, Datum, Betrag. Ich brauche einen einwöchigen Schleppdurchschnitt, der sich täglich bewegt und den Durchschnittswert pro Transaktion bildet. Das Problem ist, dass es manchmal keine Transaktionen im besonderen Datum gibt, und ich brauche Durchschnitt pro Transaktion, nicht pro Tag, und nachgezogener Durchschnitt bewegt sich am Tag, nicht nach Woche. In diesem speziellen Fall kann ich OVER nicht mit vorhergehenden Zeilen verwenden. Ich bin Stapel mit ihm :(Moving Trailing Woche Durchschnitt in PostgreSQL

Daten sieht wie folgt aus: https://gist.github.com/avitominoz/a252e9f1ab3b1d02aa700252839428dd

+0

bearbeiten Sie Ihre Frage und zeigen die Abfrage, die Sie ha.. ve. Außerdem sollten Sie die Datenstruktur direkt in die Frage als Text und nicht als Bild einfügen. –

Antwort

0

Es gibt zwei Methoden, um dies zu tun One verwendet generate_series() alle Ergebnisse zu erhalten, die zweite verwendet eine seitliche verbinden

...
with minmax as (
     select min(trade_date) as mintd, max(trade_date) as maxtd 
     from sales 
    ) 
select days.dte, s.values, 
     avg(values) over (order by days.dte 
         rows between 6 preceding and current row 
         ) as avg_7day 
from generate_series(mintd, maxtd, interval '1 day') days(dte) left join 
    sales s 
    on s.trade_dte = days.dte; 

Hinweis: dies ignoriert die Werte an den Tagen fehlt, anstatt sie als 0 Behandlung Wenn Sie 0 wollen, dann avg(coalesce(values, 0)) verwenden