在PostgreSQL中移动平均周末平均值

时间:2016-04-05 12:07:37

标签: sql postgresql window-functions moving-average

我的源数据包括交易ID,日期,金额。我需要一个一周的跟踪平均值,每日移动平均值和每笔交易的平均金额。问题是,有时在特定日期没有交易,我需要每次交易平均,每天不平均,并且平均每天移动平均值,而不是按周计算。在这种特殊情况下,我不能使用OVER前面的行。我跟它叠加:(

数据如下所示: https://gist.github.com/avitominoz/a252e9f1ab3b1d02aa700252839428dd

1 个答案:

答案 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))