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

Average on 12 preceding months interval and ISO Weeks

提问人:Matias 提问时间:12/15/2020 最后编辑:GMBMatias 更新时间:12/16/2020 访问量:539

问:

我有以下查询来获取前 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 第 1 周 2020(实际上是“2019-12-30”)在计算中没有考虑在内。

有没有办法说前 12 个月和当前行,但使用 ISO 周?

谢谢

SQL PostgreSQL 时间 窗口函数 日期算术

评论


答:

1赞 GMB 12/15/2020 #1

这不是你想要的吗?

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 年同一周的行带到当前行。

1赞 Gordon Linoff 12/15/2020 #2

这太长了,无法发表评论。

我认为没有一种简单的方法可以做到这一点。问题在于“周”和“年”之间的差异。在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 周,但这可能是一个合理的解释。

评论

0赞 Matias 12/16/2020
谢谢,我唯一的问题是,回溯 52 或 53 周不会达到例如 2020 年第 1 周,因为它显示为 2019 年 12 月
0赞 Gordon Linoff 12/16/2020
@Matias . . .我不完全理解你的评论。当回到 52 或 53 周时,等年不是一个考虑因素。