InfluxDB:实现每日唯一值求和(跨日期重复值计入总和)
问题描述
每日收到的数据条目中,同一天可能出现重复的_value,不同日期的相同值需要计入总和。要求实现每日内对_value去重,跨日期的相同值仍累加。当前使用的Flux查询会将所有相同值全局去重,无法得到预期结果(示例中预期总和为6.4)。
示例数据
Measurement _field _value _time GBP value 3.2 2023-05-10T09:00:00.000Z GBP value 3.2 2023-05-10T12:00:00.000Z GBP value 3.2 2023-06-02T10:00:00.000Z
当前查询代码
import "date" from(bucket: "homeassistant_db") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "GBP") |> filter(fn: (r) => r["entity_id"] == "my_cost1") |> filter(fn: (r) => r["friendly_name"] == "my_friendly_cost1") |> filter(fn: (r) => r["_field"] == "value") |> distinct(column: "_value") |> sum(column: "_value")
解决方案
核心思路是先按日期(天)分组,在每个日期组内对_value去重,最后再对所有去重后的值求和,确保单日重复值只算一次,跨日期的相同值分别计入总和。
修改后的查询代码
import "date" from(bucket: "homeassistant_db") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "GBP") |> filter(fn: (r) => r["entity_id"] == "my_cost1") |> filter(fn: (r) => r["friendly_name"] == "my_friendly_cost1") |> filter(fn: (r) => r["_field"] == "value") // 将时间截断到当天起始时间,生成日期分组标识 |> map(fn: (r) => ({ r with day: date.truncate(t: r._time, unit: 1d) })) // 按日期分组,限定去重范围为单日 |> group(columns: ["day"]) // 组内对_value去重 |> distinct(column: "_value") // 取消分组,统一计算总和 |> ungroup() // 对所有去重后的值求和 |> sum(column: "_value")
关键步骤说明
date.truncate:将每条数据的时间戳截断到当天0点,生成day字段作为分组依据;group(columns: ["day"]):把数据按天拆分,确保后续去重操作只在单日范围内生效;- 组内去重后取消分组,最后求和即可得到符合需求的结果。
内容的提问来源于stack exchange,提问作者ppstacknow
相关产品推荐
相关产品推荐

