如何在 GridDB SQL 中按小时聚合时间序列数据?
数据小许
结论
在 GROUP BY 和 SELECT 中使用 TIMESTAMP_TRUNC(HOUR, ts),将每条记录的时间截到所在小时的整点,再按电表和整点分组计算平均值。GridDB SQL 参考文档列出了 TIMESTAMP_TRUNC(field, timestamp [, timezone]) 的语法,也提供了按 HOUR 截断的示例。GridDB SQL 时间函数参考
SELECT
meter_id,
TIMESTAMP_TRUNC(HOUR, ts) AS hour,
AVG(consumption) AS avg_consumption
FROM energy_usage
GROUP BY
meter_id,
TIMESTAMP_TRUNC(HOUR, ts)
ORDER BY
meter_id,
hour;
为什么原查询会按精确时间分组
原查询将 ts 本身放进 GROUP BY,所以 2025-01-01T10:05:00Z 和 2025-01-01T10:25:00Z 会被分到不同组。使用 TIMESTAMP_TRUNC(HOUR, ts) 去掉分钟、秒和更小的时间部分后,这些记录才会归入同一个小时。
按给出的数据计算,M1 在 10 点这一小时的平均值是 (12.5 + 14.2 + 13.4) / 3 = 13.366…,四舍五入到两位小数为 13.37。M2 的平均值为 9.8。
时区注意事项
示例时间带有 Z,表示 UTC。若需按其他时区的本地小时划分分组边界,可以使用函数的可选时区参数,例如:
TIMESTAMP_TRUNC(HOUR, ts, '+09:00')
SELECT 和 GROUP BY 中应使用相同的截断表达式。统计时采用 UTC 还是本地时区,取决于你的统计口径。
备注:内容仅供参考。
