2016-04-05 6 views
0

Мои исходные данные включают в себя идентификатор транзакции, дату, сумму. Мне нужно однонедельное трейлинг-усреднение, которое перемещается ежедневно и усредняет сумму за транзакцию. Проблема заключается в том, что иногда нет транзакций в особую дату, и мне нужно использовать для каждой транзакции, не в день, а трейлинг-средний - по дням, а не по неделям. В этом конкретном случае я не могу использовать OVER с предшествующими строками. Я стопка с ним :(Перемещение средней недельной недели в PostgreSQL

данных выглядит следующим образом: https://gist.github.com/avitominoz/a252e9f1ab3b1d02aa700252839428dd

+0

Пожалуйста, измените свой вопрос и показать запрос, который вы га.. ве. Кроме того, вы должны поместить структуру данных непосредственно в вопрос как текст, а не через изображение. –

ответ

0

Есть два способа сделать это один использует generate_series(), чтобы получить все результаты Второй использует боковую присоединиться

...
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; 

Примечание: это игнорирует значения на отсутствующий дней, а не рассматривать их как 0 Если вы хотите 0, а затем использовать avg(coalesce(values, 0))