如何基于累积数据统计每小时燃气消耗量(InfluxDB 1.6.7+Grafana)
在Grafana中基于InfluxDB 1.6.7按小时统计燃气表消耗量(从累积值计算)
核心思路
燃气表的累积值变化量就是实际消耗量,我们需要通过InfluxQL计算每小时内累积值的总变化量,而非直接展示持续增长的累积值。
方法1:首尾值差计算(简单直接)
通过获取每个小时内的第一个和最后一个累积值,两者的差值即为该小时的消耗量,适合大多数场景。
InfluxQL查询语句
SELECT ("end" - "start") AS "hourly_consumption" FROM ( -- 子查询:按小时分组,提取每组的首尾累积值 SELECT first("total_consumption") AS "start", last("total_consumption") AS "end" FROM "gas_meter" -- 替换为你的measurement名称 WHERE $timeFilter -- Grafana内置时间变量,与面板时间范围联动 GROUP BY time(1h), "meter_id" -- 替换为你的标签(多表时需保留) )
异常值处理(可选)
若遇到燃气表数据回滚(极少发生),可添加判断避免出现负数:
SELECT IF("end" >= "start", "end" - "start", 0) AS "hourly_consumption" FROM ( SELECT first("total_consumption") AS "start", last("total_consumption") AS "end" FROM "gas_meter" WHERE $timeFilter GROUP BY time(1h), "meter_id" )
方法2:连续差值求和(精确统计)
如果需要统计每一次数据上报的变化量总和(比如中间存在多次小幅度增长),可先用difference()计算连续数据点的差值,再按小时求和。
InfluxQL查询语句
SELECT SUM("delta") AS "hourly_consumption" FROM ( -- 子查询:按小粒度时间分组(确保捕捉所有变化),计算连续点差值 SELECT difference("total_consumption") AS "delta" FROM "gas_meter" WHERE $timeFilter GROUP BY time(1m), "meter_id" -- 时间粒度可根据数据上报频率调整 ) GROUP BY time(1h), "meter_id"
Grafana配置步骤
- 确认数据源为InfluxDB 1.x版本(请勿使用Flux查询模式)
- 新建面板(推荐选择Graph或Stat类型)
- 复制上述查询语句,替换对应的
measurement、字段名和标签 - 调整面板时间范围,即可查看每小时的消耗量数据
内容的提问来源于stack exchange,提问作者user3466413
相关产品推荐
相关产品推荐

