假设我们有以下数据,每秒测量一次温度。数据跨度为几年,因此有相当多的行。这是来自现场设备的测量数据。该表还有其他列,但它们与问题无关。
时间 | 温度_摄氏度 |
---|---|
2024-11-01 00:00:00+00 | 20.1 |
2024-11-01 00:00:01+00 | 21.2 |
2024-11-01 00:00:02+00 | 21.6 |
2024-11-01 00:00:03+00 | 20.2 |
... | ... |
2026-12-31 23:59:57+00 | 25.4 |
2026-12-31 23:59:58+00 | 25.2 |
2026-12-31 23:59:59+00 | 25.6 |
我知道我可以使用一个GROUP BY
子句来获取特定开始和结束时间之间一小时窗口内的平均值,如下所示:
SELECT to_char("time", 'YYYY-MM-DD HH'), AVG("Temperature_deg_in_C")
FROM "measurements"
WHERE "time" BETWEEN '2024-11-01' AND '2024-12-01'
GROUP BY to_char("time", 'YYYY-MM-DD HH')
但是,这种语法感觉像是一种黑客行为,并且它不能完全适应例如 10 秒或其他更复杂的窗口框架(或分区)。
此外,我想具体了解如何使用 PostgreSQL 手册中概述的、、、、和类似工具正确且高效地完成OVER
此操作。WINDOW
PARTITION BY
RANGE
ROWS
更新:窗口函数不能用在 Postgres 上实现这个目标,因为它们不会像我想象的那样创建“存储桶”或“框架”。GROUP BY
是实现这一目标的方法。
最终目标是找到一种解决方案,其中窗口长度和测量单位(分钟、小时、天)以及观察期的开始和结束时间是灵活的,但查询主体本身保持不变。也就是说,一个简单易懂的参数化查询。