每周平均值,滚动年

weekly averages, rolling year

我需要使用 Postgres 计算滚动年平均值 SQL,我有按年、月和周分类的数据(示例):

我需要计算每周滚动平均值(这是去年单位的总和除以当年的周数)。

因此,例如,如果我在 2020 年第 40 周,我需要得到这一周之前所有周的总和,直到 2019 年第 40 周,然后除以该范围内的总周数。我需要这个计算作为每一行的新列.. 我该怎么做?

谢谢

这可以使用 window function based on RANGE(因为 PostgreSQL 11):

demo:db<>fiddle

SELECT
    *,
    AVG(unit) OVER (                                              -- 3
       ORDER BY to_date(y::text || '-' || w::text, 'IYYY-IW')     -- 1
       RANGE BETWEEN interval '1 year' PRECEDING AND CURRENT ROW  -- 2
    )
FROM
    t
  1. 创建订单标准 - 它必须与所选的 RANGE 类型兼容。在这种情况下,我们需要一个时间范围,因此顺序标准必须是日期时间类型。为了实现这一点,我们从年和周创建一个日期(首先创建一个日期字符串,以便能够使用日期模式转换它)
  2. Window 函数基于 RANGEs:它允许根据日期创建 window 大小,无论存在多少条记录。如果你能确保每周记录一条记录,你可以使用 ROWS BETWEEN 52 PRECEDING AND CURRENT ROW 代替,但它不太准确,因为一年中可能有第 53 周(v11 之前版本的可能解决方案)
  3. 计算 AVG window。