InfluxDB如何按时间点求和所有id标签对应的value字段?
解决方案
你需要调整查询的分组逻辑,同时将聚合函数从mean改为sum,确保同一时间窗口内所有id的value被求和。以下是修正后的查询:
from(bucket: "test-bucket") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "plug") |> filter(fn: (r) => r["_field"] == "value") // 移除id标签的分组,将所有id的记录合并到同一分组中 |> group(columns: ["_measurement", "_field"], mode: "by") // 按时间窗口聚合,对窗口内所有id的value求和 |> aggregateWindow(every: v.windowPeriod, fn: sum, createEmpty: false) |> yield(name: "sum")
关键说明:
- 移除原查询中针对单个
id的过滤条件,确保包含所有id的记录 - 使用
group(columns: ["_measurement", "_field"], mode: "by"):默认情况下Flux会按所有标签(包括id)分组,导致每个id单独聚合。通过指定仅按_measurement和_field分组,所有id的同时间点数据会被归为一组,为求和做准备 - 将
aggregateWindow的fn参数从mean改为sum,让每个时间窗口内的所有value被求和而非取平均值
如果你的数据时间戳存在不严格对齐的情况,可以在分组后添加|> fill(column: "_value", value: 0.0)补全缺失值,避免某个id在时间点无数据时被忽略,保证求和结果准确。
内容的提问来源于stack exchange,提问作者chindit
相关产品推荐
相关产品推荐

