前 12 个月间隔和 ISO 周的平均值

Average on 12 preceding months interval and ISO Weeks

我有以下查询来获取一个时间间隔内前 12 个月的平均单位数,但我的问题是前 12 个月没有考虑一年中的 ISO 第 1 周,例如:

SELECT
    *,
   avg(units) OVER (                                             
       ORDER BY to_date(year::text || '-' || week::text, 'IYYY-IW')     
       RANGE between interval '12 months' preceding and current row)
FROM
   rolling_year_table 
   order by year,week;

基本上 ISO 2020 年第 1 周(实际上是“2019-12-30”)在计算中没有考虑在内。

有没有办法说出前一行和当前行的 12 个月但使用 ISO 周数?

谢谢,

这不是你想要的吗?

select ry.*,
   avg(units) over (                                             
       order by year * 100 + week
       range between 100 preceding and current row
from rolling_year_table 
order by year,week;

假设当前行是 2020 年第 45 周,这会将 2019 年同一周的行添加到当前行。

评论太长了。

我认为没有简单的方法可以做到这一点。问题是“周”和“年”之间的差异。在 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)

编辑:

我不能 100% 确定这是否适用于您的用例。但我有一个想法可能会做你想做的事。也就是将一年中的第几周枚举为一年中的分数。因此,有 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 周没有明确定义,但这可能是一个合理的解释。