You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 19:40:26