【问题标题】:weekly averages, rolling year [closed]周平均值,滚动年[关闭]
【发布时间】:2021-03-22 21:09:49
【问题描述】:

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

我需要计算每周滚动平均值(这是过去一年的单位总和,然后除以该年的周数)。

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

谢谢

【问题讨论】:

  • 请向我们展示您输入数据的预期结果。目前尚不清楚“滚动平均”是什么意思。对我来说,它看起来更“累积”:将直到本周的单位相加,然后除以本周的记录数(= AVG)
  • 我刚刚编辑了我的问题,以便更清楚地了解我需要什么
  • 检查我更新的答案。

标签: postgresql average rolling-computation


【解决方案1】:

这可以使用 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. 基于RANGEs的窗口功能:它允许根据日期创建窗口大小,无论有多少记录。如果您可以确保每周有一条记录,则可以改用ROWS BETWEEN 52 PRECEDING AND CURRENT ROW,但由于一年中可能有第 53 周,因此准确性较低(v11 之前版本的可能解决方案)
  3. 计算该窗口上的AVG

【讨论】:

  • 我需要平均值,但是在过去几周内,所以如果我想计算例如第 5 周的滚动年平均值,那么我需要从 2020 年第 4 周到 2019 年第 5 周回顾并计算的平均值
  • 改变了答案
  • 感谢它部分工作,列表中有重复的周数,因为有些周在 2 个月内是相同的,所以我需要找到一种方法来仅通过不同的数量来获取 AVG周而不是按周/月
  • 您可以在进行 AVG 计算前几周进行 GROUP 或 DISTINCT:... FROM (SELECT SUM(w) FROM t GROUP BY w) s... FROM (SELECT DISTINCT ON (w) * FROM t) s
猜你喜欢
  • 2019-09-04
  • 2020-06-06
  • 1970-01-01
  • 2023-02-08
  • 2016-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多