InfluxDB查询实现:统计指定时间段每日水泵触发次数
问题解答
这个需求完全可以实现,你的数据存储结构已经满足统计要求,核心逻辑是过滤出所有水泵开启事件,按自然日窗口聚合计数即可。
Flux 查询(适用于InfluxDB 2.x / InfluxDB Cloud)
将查询中占位的桶名替换为你实际使用的存储桶名称即可直接使用:
from(bucket: "替换为你的实际bucket名称") |> range(start: -30d) |> filter(fn: (r) => r._measurement == "activities") |> filter(fn: (r) => r.action == "pump" and r.type == "on") |> filter(fn: (r) => r._field == "count") |> aggregateWindow(every: 1d, fn: sum, createEmpty: true) |> yield(name: "daily_pump_on_count")
查询说明
- 过滤逻辑只保留
action=pump且type=on的记录,自动排除水泵关闭事件、其他设备的活动记录 - 按1天为窗口做聚合,由于每条开启记录的
count字段值固定为1,窗口内sum结果就是当日水泵开启总次数 createEmpty: true参数会自动给没有水泵开启记录的日期填充0值,适配折线图、柱状图的连续时间轴展示,不需要的话可以改为false- 如果需要按传感器、控制器维度分别统计每日开启次数,在filter语句后添加
|> group(columns: ["sensor"])即可,括号内填入需要分组的tag名 - 若统计结果时间和本地时区不匹配,东八区用户可在
aggregateWindow前添加|> timeShift(duration: 8h, columns: ["_time"])调整时区
InfluxQL 查询(适用于InfluxDB 1.x版本)
SELECT count("count") AS daily_pump_on_count FROM activities WHERE action = 'pump' AND type = 'on' AND time > now() - 30d GROUP BY time(1d) FILL(0)
查询说明
GROUP BY time(1d)指定按1天粒度切分时间窗口,count函数统计每个窗口内的开启事件总数FILL(0)会将无开启记录的日期值填充为0,不需要可直接删除该子句- 东八区用户可在
GROUP BY time(1d)后添加, tz('Asia/Shanghai')修正时区偏差
内容的提问来源于stack exchange,提问作者Divyansh Khandelwal
相关产品推荐
相关产品推荐

