使用SQL将 GridDB的时序数据按小时聚合

编程语言 2026-07-11

我在尝试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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章