每周平均值,滚动年
weekly averages, rolling year
我需要使用 Postgres 计算滚动年平均值 SQL,我有按年、月和周分类的数据(示例):
我需要计算每周滚动平均值(这是去年单位的总和除以当年的周数)。
因此,例如,如果我在 2020 年第 40 周,我需要得到这一周之前所有周的总和,直到 2019 年第 40 周,然后除以该范围内的总周数。我需要这个计算作为每一行的新列..
我该怎么做?
谢谢
这可以使用 window function based on RANGE
(因为 PostgreSQL 11):
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
- 创建订单标准 - 它必须与所选的
RANGE
类型兼容。在这种情况下,我们需要一个时间范围,因此顺序标准必须是日期时间类型。为了实现这一点,我们从年和周创建一个日期(首先创建一个日期字符串,以便能够使用日期模式转换它)
- Window 函数基于
RANGE
s:它允许根据日期创建 window 大小,无论存在多少条记录。如果你能确保每周记录一条记录,你可以使用 ROWS BETWEEN 52 PRECEDING AND CURRENT ROW
代替,但它不太准确,因为一年中可能有第 53 周(v11 之前版本的可能解决方案)
- 计算
AVG
window。
我需要使用 Postgres 计算滚动年平均值 SQL,我有按年、月和周分类的数据(示例):
我需要计算每周滚动平均值(这是去年单位的总和除以当年的周数)。
因此,例如,如果我在 2020 年第 40 周,我需要得到这一周之前所有周的总和,直到 2019 年第 40 周,然后除以该范围内的总周数。我需要这个计算作为每一行的新列.. 我该怎么做?
谢谢
这可以使用 window function based on RANGE
(因为 PostgreSQL 11):
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
- 创建订单标准 - 它必须与所选的
RANGE
类型兼容。在这种情况下,我们需要一个时间范围,因此顺序标准必须是日期时间类型。为了实现这一点,我们从年和周创建一个日期(首先创建一个日期字符串,以便能够使用日期模式转换它) - Window 函数基于
RANGE
s:它允许根据日期创建 window 大小,无论存在多少条记录。如果你能确保每周记录一条记录,你可以使用ROWS BETWEEN 52 PRECEDING AND CURRENT ROW
代替,但它不太准确,因为一年中可能有第 53 周(v11 之前版本的可能解决方案) - 计算
AVG
window。