使用SQL将 GridDB的时序数据按小时聚合
我在尝试GridDB SQL,并希望把时间序列数据按小时区间聚合。
表结构:
CREATE TABLE energy_usage
(
meter_id STRING,
ts TIMESTAMP,
consumption DOUBLE
);
示例数据:
| 表计量器ID | 时间戳 | 用量 |
|---|---|---|
| M1 | 2025-01-01T10:05:00Z | 12.5 |
| M1 | 2025-01-01T10:25:00Z | 14.2 |
| M1 | 2025-01-01T10:45:00Z | 13.4 |
| M1 | 2025-01-01T11:10:00Z | 11.8 |
| M2 | 2025-01-01T10:15:00Z | 9.5 |
| M2 | 2025-01-01T10:35:00Z | 10.1 |
我的当前查询——对每个表计的简单聚合是可行的:
SELECT meter_id, AVG(consumption)
FROM energy_usage
GROUP BY meter_id;
问题
我想计算每个表计在每个小时的平均消耗。
然而,当我尝试这个查询时:
SELECT meter_id, ts, AVG(consumption)
FROM energy_usage
GROUP BY meter_id, ts;
它按精确的时间戳值进行分组,而不是把时间戳分组到按小时的区间。
期望结果:
| meter_id | hour | avg_consumption |
|---|---|---|
| M1 | 2025-01-01 10:00:00 | 13.37 |
| M1 | 2025-01-01 11:00:00 | 11.8 |
| M2 | 2025-01-01 10:00:00 | 9.8 |
如何在GridDB SQL中把时间戳按小时分组,以在计算平均消耗时忽略分钟和秒?
解决方案
要解决这个问题,你需要浏览 GridDB函数清单,其中列出了与时间戳相关的函数,然后找一个可以把时间戳精确到小时的函数。看起来 TIMESTAMP_TRUNC 函数正是所需的。
SELECT
meter_id
, TIMESTAMP_TRUNC(HOUR, ts) AS hourly_timestamp
, AVG(consumption)
FROM energy_usage
GROUP BY meter_id, hourly_timestamp;
备注:我没有实际的GridDB环境来测试,但据我所知,与标准SQL不同,你可以按列别名进行分组——事实上你必须这么做。
不过,这取决于你所使用的GridDB版本,你可能可以访问 GROUP BY RANGE 这个功能,值得探索,尽管它似乎并不能解决你确切的问题,因为你不能 GROUP BY 常规列(例如 meter_id)并使用 GROUP BY RANGE。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。