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