SQL - 在截断日期上滚动平均值

Posted

技术标签:

【中文标题】SQL - 在截断日期上滚动平均值【英文标题】:SQL - Rolling avg over truncated date 【发布时间】: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 的解决方案。

【问题讨论】:

【参考方案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 功能的解决方案。根本不可能吗?

以上是关于SQL - 在截断日期上滚动平均值的主要内容,如果未能解决你的问题,请参考以下文章

基于不同日期的红移滚动平均值

在多个日期窗口上应用熊猫滚动的更快方法

如何计算 BigQuery 的滚动平均值

如何在 MySQL 8 中使用两个变量进行滚动平均?

SQL Server 中 7 天滚动平均值的 SQL 查询

sql 日期/时间的平均值