InfluxDB 2.0如何使用Flux合并两个独立bucket的数据流并求和
问题原因说明
你当前使用union仅能将两张表的行数据拼接,不会进行跨表数值聚合,且两张原始表的分组键包含_bucket字段,因此union后仍返回两个独立的结果表,不符合求和需求。
解决方案代码
// 查询A类蜜蜂数据,重命名数值字段方便区分 bucket1 = from(bucket: "beeA") |> range(start: 0) |> filter(fn: (r) => r["_measurement"] == "population") |> filter(fn: (r) => r["_field"] == "pop") |> rename(columns: {_value: "a_pop"}) |> keep(columns: ["_time", "a_pop"]) // 仅保留需要的字段,避免多余分组 // 查询B类蜜蜂数据,重命名数值字段 bucket2 = from(bucket: "beeB") |> range(start: 0) |> filter(fn: (r) => r["_measurement"] == "population") |> filter(fn: (r) => r["_field"] == "pop") |> rename(columns: {_value: "b_pop"}) |> keep(columns: ["_time", "b_pop"]) // 全外连接按时间对齐两张表 join( tables: {t1: bucket1, t2: bucket2}, on: ["_time"] ) // 缺失值用前一个最新值填充,匹配「取对应时间点最新值求和」的需求 |> fill(columns: ["a_pop", "b_pop"], usePrevious: true) // 计算总种群数 |> map(fn: (r) => ({r with total: r.a_pop + r.b_pop})) // 按时间排序 |> sort(columns: ["_time"])
补充说明
- 如果查询的时间范围起始点没有对应A或B的初始值,可以在fill操作前补充
|> fill(columns: ["a_pop", "b_pop"], value: 0)处理首个时间点的空值问题 - 若需要保留原始的A、B类种群数值,可以不用删除a_pop、b_pop字段,按需调整keep的字段列表即可
内容的提问来源于stack exchange,提问作者Khaaz
相关产品推荐
相关产品推荐

