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 - 在截断日期上滚动平均值的主要内容,如果未能解决你的问题,请参考以下文章