如何用InfluxQL统计InfluxDB中变量值为True的持续时长?
用InfluxQL统计布尔值为True的总持续时长
需求说明
给定包含time和running(布尔类型)字段的数据集,需计算running值为True的所有连续时间段的总时长,示例数据的期望结果为1小时(50分钟+10分钟)。
实现查询语句
SELECT SUM(duration) / 3600 AS "Duration True: h" FROM ( SELECT (time - prev_time) / 1000000000 AS duration FROM ( SELECT time, running, LAG(time) OVER (ORDER BY time) AS prev_time, LAG(running) OVER (ORDER BY time) AS prev_running FROM "your_measurement" -- 可根据需要调整时间范围,若查询全量数据可删除此行 WHERE time >= '2022-09-16T00:00:00Z' AND time <= '2022-09-16T23:59:59Z' ) t WHERE (running = false AND prev_running = true) )
逻辑解释
- 内层子查询:使用
LAG()窗口函数,为每条记录获取上一条数据的时间(prev_time)和running状态(prev_running),按时间顺序排序。 - 中间子查询:筛选出
running从True切换为False的行,计算当前时间与上一条时间的差值(InfluxDB时间以纳秒存储,除以1e9转换为秒),得到该段True状态的持续时长。 - 外层查询:将所有符合条件的时长求和,再除以
3600转换为小时单位,得到总时长。
结果验证
针对示例数据,查询会计算两段True区间的时长:
2022-09-16 09:10:00到2022-09-16 10:00:00:3000秒(50分钟)2022-09-16 12:00:00到2022-09-16 12:10:00:600秒(10分钟)
总和为3600秒,转换后即为1小时,符合期望结果。
内容的提问来源于stack exchange,提问作者mmmmgggg
相关产品推荐
相关产品推荐

