这段内容太长了不能作为评论。
我认为这并不容易。问题在于“周”和“年”的差异。在12个月的时间内,大约有52.2个星期。所以,您所问的是有时“12个月”期间有52个星期,有时有53个星期。
我认为您可以基于过去52个星期进行累积计算,然后使用条件逻辑来包括前53个星期。问题是...我不知道往前回溯53个星期的确切规则。
如果唯一的问题是在一年的第53个星期,则应该包括整个年份,那将非常容易。伪代码如下:
(case when isoweek = 53
then avg() over (. . . range between '53 week' preceding and current row)
else avg() over (. . . range between '52 week' preceding and current row)
end)
编辑:
我不确定这个方法是否适用于你的使用情况。但是我有一个想法,可能可以实现你想要的功能。那就是将一年的周数以 分数 的形式列举出来。所以拥有 52 周的年份将有一个列举,而拥有 53 周的年份将有另一个列举。
这将看起来像:
select . . .,
avg(units) over (order by year + (isoweek - 1) / weeks_in_year
range between 1 preceding and current row
)
from (select t.*,
extract(isoyear from dte) as isoyear,
extract(week from dte) as isoweek,
greatest(extract(week from date_trunc('year', dte) + interval '1 year - 1 day'), 53) as weeks_in_year
f from t
) t;
你需要测试一下,看看它是否符合你的真正需求。正如我在本答案开头所说,“12个月前”对于ISO周并没有清晰的定义,但这可能是一个合理的解释。