You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MonetDB中实现时间序列按指定周期Downsampling/Upsampling聚合

你遇到的语法报错是因为MonetDB的EXTRACT函数不支持DATE作为提取单位,且单独拆分时间分量再聚合的方案灵活性很低,无法适配2天、12小时这类自定义周期的下采样需求。

MonetDB提供*date_trunc*函数用于时间戳的周期对齐,是实现时间序列下采样的最优方案,它可以直接按指定周期将时间戳对齐到对应周期的起始点,按对齐后的字段分组聚合即可得到对应周期的统计值。

基础示例:按1小时聚合

SELECT 
  date_trunc('hour', "time") AS time_bucket,
  AVG(ph) AS avg_ph,
  AVG(temperature) AS avg_temperature
FROM datapoints
GROUP BY time_bucket
ORDER BY time_bucket;

该语句会将所有时间戳对齐到所属小时的0分0秒,分组后得到每一个自然小时的聚合结果,不会出现跨天聚合的问题。

自定义周期下采样示例

按2天聚合

SELECT
  date_trunc('day', "time") - (EXTRACT(DAY FROM "time") % 2) * INTERVAL '1 day' AS time_bucket,
  AVG(ph) AS avg_ph
FROM datapoints
GROUP BY time_bucket
ORDER BY time_bucket;

按12小时聚合

SELECT
  date_trunc('hour', "time") - (EXTRACT(HOUR FROM "time") % 12) * INTERVAL '1 hour' AS time_bucket,
  AVG(ph) AS avg_ph
FROM datapoints
GROUP BY time_bucket
ORDER BY time_bucket;

任意秒级周期聚合(以5分钟/300秒为例)

如果需要更灵活的周期,可以先将时间戳转成epoch秒数取整后再转回时间:

SELECT
  TO_TIMESTAMP(FLOOR(EXTRACT(EPOCH FROM "time") / 300) * 300) AS time_bucket,
  AVG(ph) AS avg_ph
FROM datapoints
GROUP BY time_bucket
ORDER BY time_bucket;

补充说明

如果需要按不同站点分别统计聚合结果,将id_station字段加到SELECT和GROUP BY列表中即可。

内容的提问来源于stack exchange,提问作者AbdelKh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 20:54:03