如何用Flux语法计算指标与历史月均值的比值?
解决Flux计算指标与历史平均值比值的问题
核心思路是先分别拿到窗口聚合后的原始值和对应的30天移动平均值,再将两者关联后计算比值。以下是完整可运行的代码:
// 1. 提取并聚合原始数据:按query分组,计算每个时间窗口的sum值 rawData = from(bucket: "secret_bucket") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == "pg_stat_statements_fw") |> group(columns: ["query"]) |> aggregateWindow(every: v.windowPeriod, fn: sum) |> keep(columns: ["_time", "_value", "query"]) // 只保留后续需要的字段 // 2. 基于原始聚合数据计算30天移动平均值 tmaData = rawData |> timedMovingAverage(every: v.windowPeriod, period: 30d) // 窗口周期要和原始聚合一致,保证时间对齐 |> rename(columns: {_value: "tma_value"}) // 重命名平均值字段,避免和原始值冲突 |> keep(columns: ["_time", "tma_value", "query"]) // 3. 关联原始值与平均值,计算比值 rawData |> join(tables: {tma: tmaData}, on: ["_time", "query"]) // 按时间和query匹配数据 |> map(fn: (r) => ({ r with ratio: r._value / r.tma_value, // 核心:计算原始值与历史平均值的比值 _value: r.ratio // 可选:把比值设为默认展示的_value字段,方便直接绘图 })) |> drop(columns: ["tma_value"]) // 移除不需要的中间字段
关键注意点:
- 必须保证
timedMovingAverage的every参数和aggregateWindow的every完全一致,否则时间窗口不对齐,关联后会出现数据缺失。 - 如果需要同时保留原始的
_value和计算出的ratio,可以删除_value: r.ratio这一行,单独保留ratio字段即可。
内容的提问来源于stack exchange,提问作者Alexi Theodore
相关产品推荐
相关产品推荐

