【问题标题】:Influxdb Flux query with custom window aggregate function带有自定义窗口聚合函数的 Influxdb Flux 查询
【发布时间】:2021-11-11 18:39:57
【问题描述】:

能否请您帮助我使用 InfluxDB 2 Flux 查询语法来构建具有自定义聚合函数的窗口查询。

我浏览了在线文档,但它们似乎缺少有关如何从自定义聚合函数中获取实际窗口内容(第一条、最后一条记录)的示例。它也没有立即描述自定义函数的预期签名。

我想构建一个带有滑动窗口的查询,它会在窗口中的第一个值和最后一个值之间产生差异。大致如下:

difference = (column, tables=<-) => ({ tables.last() - tables.first() })

from(bucket: "my-bucket")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "simple")
  |> filter(fn: (r) => r["_field"] == "value")
  |> aggregateWindow(every: 1mo, fn: difference, column: "_value", timeSrc: "_stop", timeDst: "_time", createEmpty: true)
  |> yield(name: "diff")

上面例子的语法显然是错误的,但希望你能明白,我要做什么。

谢谢!

【问题讨论】:

    标签: influxdb influxdb-2


    【解决方案1】:

    想出了以下内容。它至少在语法上有效:

    from(bucket: "my-bucket")
      |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
      |> filter(fn: (r) => r["_measurement"] == "simple")
      |> filter(fn: (r) => r["_field"] == "value")
      |> aggregateWindow(
          every: 1mo, 
          fn: (column, tables=<-) => tables |> reduce(
                identity: {first: -1.0, last: -1.0, diff: -1.0},
                fn: (r, acc) => ({
                    first:
                        if acc.first < 0.0 then r._value
                        else acc.first,
                    last:
                        r._value,
                    diff:
                        if acc.first < 0.0 then 0.0
                        else (acc.last - acc.first)
                })
              )
              |> drop(columns: ["first", "last"])
              |> set(key: "_field", value: column)
              |> rename(columns: {diff: "_value"})
          )
      |> yield(name: "diff")
    

    虽然窗口并没有真正滑动。

    滑动窗口也一样:

    from(bucket: "my-bucket")
      |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
      |> filter(fn: (r) => r["_measurement"] == "simple")
      |> filter(fn: (r) => r["_field"] == "value")
      |> window(every: 1h, period: 1mo)
      |> reduce(
        identity: {first: -1.0, last: -1.0, diff: -1.0},
        fn: (r, acc) => ({
            first:
                if acc.first < 0.0 then r._value
                else acc.first,
            last:
                r._value,
            diff:
                if acc.first < 0.0 then 0.0
                else (acc.last - acc.first)
        })
      )
      |> duplicate(column: "_stop", as: "_time")
      |> drop(columns: ["first", "last"])
      |> rename(columns: {diff: "_value"})
      |> window(every: inf)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-23
      • 2023-01-20
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      • 2018-07-20
      • 2019-09-29
      • 1970-01-01
      相关资源
      最近更新 更多