如何使用Flux编写InfluxDB多列查询按指定列分组的语句?
InfluxDB Flux 等价查询实现
对应你给出的SQL查询逻辑,可直接使用如下Flux语句,注意Flux采用流水线式的处理逻辑,执行顺序和代码书写顺序一致:
from(bucket: "替换为你实际使用的bucket名称") // Flux强制要求指定查询时间范围,请根据业务场景替换参数,例如查最近24小时可写为start: -24h |> range(start: -1h) // 匹配目标measurement |> filter(fn: (r) => r._measurement == "measurement") // 筛选需要查询的field_a、field_b两个字段 |> filter(fn: (r) => r._field == "field_a" or r._field == "field_b") // 将InfluxDB默认的行式字段存储转换为类似SQL的多列宽表结构 |> pivot(rowKey:["_time"], columnKey: ["_field"], valueColumn: "_value") // 筛选field_a值为10的记录 |> filter(fn: (r) => r.field_a == 10) // 按field_b字段分组 |> group(columns: ["field_b"])
逻辑对应说明
- 时间范围配置:
range()是Flux查询的必填项,没有默认时间范围,你可以传入相对时间(比如-7d代表最近7天),也可以传入固定起止时间,例如start: 2024-01-01T00:00:00Z, end: 2024-02-01T00:00:00Z - 基础资源筛选:前两个
filter()函数分别完成测量、目标字段的圈定,匹配SQL中from 'measurement'选取数据源、select field_a,field_b选取字段的逻辑 - 结构转换:
pivot()是多字段查询时的常用操作,因为InfluxDB底层会把每个字段的值单独存为一行,必须通过行列转换才能同时对多个字段做筛选、计算 - 条件过滤:pivot完成后直接通过
filter()匹配field_a == 10的记录,和SQL中where field_a = 10的逻辑完全一致 - 分组操作:最后调用
group()并指定分组列为field_b,即可实现SQL中group by field_b的效果,如果需要在分组后做聚合(比如计数、求和、求均值),直接在group()后拼接对应聚合函数即可,例如|> count()可以统计每个field_b分组下的符合条件的记录总数
注意:如果field_b是tag类型而非field类型,上述语句依然可以正常运行,tag在pivot后会默认作为普通列存在,可直接用于分组、筛选。
内容的提问来源于stack exchange,提问作者Nikhil
相关产品推荐
相关产品推荐

