如何消除InfluxDB聚合窗口查询中最后一个残留数据点

问题描述 投票:0回答:3

我有一个关于 InfluxDB 的查询问题;

我正在尝试汇总每天的数据并获取中位数。 日期被截断为当天的开始 (00:00:000) 但是,查询会返回最后一个数据,该数据不会被截断到当天的开始; 如何将最后一个数据点的时间截断到一天的开始/或忽略最后一个值?

我的询问:

from(bucket: "metric")
  |> range(start: -30d, stop: 0d)
  |> filter(fn: (r) => r["_measurement"] == "metric")
  |> filter(fn: (r) => r["_field"] == "value")
  |> filter(fn: (r) => r["metric"] == "SOME_METRIC")
  |> aggregateWindow(every: 1d, fn: median, createEmpty: true)
  |> yield(name: "median")

我添加了查询结果,文字说明了我的情况

我想要得到的是以下几点:

(假设今天是 2022 年 2 月 17 日);

15.02.2022 00:00:00:000 - 16.02.2022 00:00:00:000 - 17.02.2022 00:00:00:000

但是我得到了

15.02.2022 00:00:00:000 - 16.02.2022 00:00:00:000 - 17.02.2022 00:00:00:000 - 17.02.2022 05:30:27:437

提前致谢。

aggregate influxdb
3个回答
1
投票

我将展示示例数据。 就我而言,我用这样的查询过滤数据:

|> range(start: 2022-11-11T10:41:10.589Z, stop: 2022-11-11T17:47:05.518Z)

所以从这里我们可以看出什么是

_start
_stop
。 当我们添加
window
功能

|> window(every: 1m)

显然,最后一行的

_start
_stop
表现得很奇怪。 如果我们使用带有
window
median
函数的解决方案,我们将丢失
_time
列。 您可以在这里阅读更多相关内容


解决方案#1(回合时间范围)

您过滤的回合时间范围: 通常在grafana或其他工具中我们可能会使用这种形式的范围:

|> range(start: v.timeRangeStart, stop: v.timeRangeStop)

但为了测试我将使用:

start = date.time(t: 2022-11-11T10:41:10.589Z)
end = date.time(t: 2022-11-11T17:47:05.518Z)

start_rounded = date.truncate(t: start, unit:1m) //we can pass v.windowPeriod
end_rounded = date.truncate(t: end, unit:1m)


my_data = from(bucket: "gen")
  |> range(start: start_rounded, stop: end_rounded)

感谢这一点,我们将摆脱最后一行:
(来自范围文档)

结果排除 _time 值与指定停止点匹配的行 时间。

解决方案#2(覆盖_start、_stop)

  |> drop(columns: ["_start", "_stop"])
  |> duplicate(column: "_time", as: "_start")
  |> duplicate(column: "_time", as: "_stop")

但现在我们依赖于

_time
四舍五入,因此如果您的数据未聚合,那么这不是完美的解决方案。 (不推荐)


屏幕取自 InfluxDB 数据浏览器。


1
投票

好吧,我发现我必须在时间范围内给出准确的日期而不是 -d 表示法。此外,日期必须被截断以适合聚合窗口。

from(bucket: "metric")
  |> range(start: 2022-01-16T00:00:00Z, stop: 2022-02-17T00:00:00Z)
  |> filter(fn: (r) => r["_measurement"] == "metric")
  |> filter(fn: (r) => r["_field"] == "value")
  |> filter(fn: (r) => r["metric"] == "SOME_METRIC")
  |> aggregateWindow(every: 1d, fn: median, createEmpty: true)
  |> yield(name: "median")

0
投票

我也遇到这个问题了。我只是最终没有使用

aggregateWindow
。相反,尝试仅使用窗口函数和聚合函数,如下所示。

from(bucket: "metric")
  |> range(start: -30d, stop: 0d)
  |> filter(fn: (r) => r["_measurement"] == "metric")
  |> filter(fn: (r) => r["_field"] == "value")
  |> filter(fn: (r) => r["metric"] == "SOME_METRIC")
  |> window(every: 1d)
  |> median()
  |> group()
  |> yield(name: "median")

这似乎解决了我的问题...

© www.soinside.com 2019 - 2024. All rights reserved.