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

如何在Grafana中先插值稀疏InfluxDB数据再绘制每日增量柱状图?

InfluxDB稀疏累积时间序列的每日增量计算方案

问题背景

我的数据源是存储累积值(如燃气表读数)的稀疏时间序列InfluxDB,数据点通常间隔数天。需要创建显示每日数值增量的柱状图,缺失值采用线性插值填充。尝试过以下查询语句:

SELECT spread("value") FROM "gas" WHERE $timeFilter GROUP BY time(1d) fill(linear)

但该语句会先执行spread(value)再执行fill(linear),导致1天周期下柱状图数值为0,只有14天这类大周期才正常。需要实现先插值再计算增量的逻辑。

解决方案

要实现先插值再计算增量,需要用子查询拆分逻辑:先补全每日的累积值,再计算相邻值的差值。

具体查询语句

SELECT difference("daily_cumulative") FROM (
  -- 子查询:按天分组,用线性插值补全每日累积值
  SELECT last("value") AS "daily_cumulative" 
  FROM "gas" 
  WHERE $timeFilter 
  GROUP BY time(1d) 
  fill(linear)
)

逻辑说明

  1. 子查询层:

    • 按time(1d)分组,确保每个自然天都有一个数据点
    • 用last("value")获取当天的累积值(因累积值单调递增,first()或last()效果一致)
    • 通过fill(linear)对缺失天数的累积值做线性插值,得到连续的每日累积序列
  2. 外层查询:

    • 用difference()函数计算相邻两天累积值的差值,这个差值就是当天的燃气使用增量,直接用于柱状图即可

原查询失效原因

原查询中spread("value")会先计算每个1天窗口内的最大值与最小值之差,若当天没有原始数据点,spread返回0;之后fill(linear)是对这些0值做插值,完全不符合需求。而先插值再算差值的逻辑,能保证每个天数都有合理的累积值,再通过差值得到正确的每日增量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 13:15:21