【问题标题】:SQL - Rolling avg over truncated dateSQL - 在截断日期上滚动平均值
【发布时间】:2018-01-04 18:27:11
【问题描述】:

我想根据精度为秒的数据每周计算一个计算字段的滚动平均值。这就是我首先将日期截断为星期的原因。

所以我的临时查询是

SELECT week, AVG(my_value) OVER(ORDER BY week ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS avg_my_value 
FROM
    (SELECT id, 
           DATE_TRUNC('week', created_at) AS week,
           my_value
    FROM my_table
    ORDER BY week ASC
    ) 
GROUP BY week

我遇到的问题是 AVG 可以工作,但它是针对同一周的所有行单独完成的!我认为这是因为必须添加某种内部分组,但我遇到的问题是针对平均值的情况来设想它。

如果这很重要,我正在寻找适用于 Redshift 或 PostgreSQL 的解决方案。

【问题讨论】:

    标签: sql postgresql aggregate-functions amazon-redshift


    【解决方案1】:

    如果你想要一个累积平均值,那么:

    SELECT week,
           AVG(AVG(my_value)) OVER (ORDER BY week ASC) AS avg_my_value 
    FROM (SELECT id,  DATE_TRUNC('week', created_at) AS week, my_value
          FROM my_table
         ) t
    GROUP BY week;
    

    注意事项:

    • 子查询中的ORDER BY 是多余的。
    • 注意聚合函数的嵌套。

    【讨论】:

    • 您在窗口函数中缺少框架子句 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW。另外,为什么我需要做平均?
    • @martin 。 . . Postgres(以及几乎所有其他数据库)不需要该子句。 Amazon Redshift 可能仍需要带有 order by 的窗口子句。
    • 确实如此。平均值的平均值如何?做一个单一的平均值与首先对同一周的所有值进行平均,然后计算直到该周的滚动平均值不同。
    • @martin 。 . .您可以使用非常相似的逻辑来获取值的总和除以计数的总和。这将是总体平均值,而不是每周平均值。
    • 是的,确实做到了!虽然目标是一个具有纯 AVG 功能的解决方案。根本不可能吗?
    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多