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

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")

关键步骤说明

  1. date.truncate:将每条数据的时间戳截断到当天0点,生成day字段作为分组依据;
  2. group(columns: ["day"]):把数据按天拆分,确保后续去重操作只在单日范围内生效;
  3. 组内去重后取消分组,最后求和即可得到符合需求的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 20:57:12