我有一个关于 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
提前致谢。
我将展示示例数据。 就我而言,我用这样的查询过滤数据:
|> 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
列。 您可以在这里阅读更多相关内容
您过滤的回合时间范围: 通常在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 值与指定停止点匹配的行 时间。
|> drop(columns: ["_start", "_stop"])
|> duplicate(column: "_time", as: "_start")
|> duplicate(column: "_time", as: "_stop")
但现在我们依赖于
_time
四舍五入,因此如果您的数据未聚合,那么这不是完美的解决方案。 (不推荐)
屏幕取自 InfluxDB 数据浏览器。
好吧,我发现我必须在时间范围内给出准确的日期而不是 -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")
我也遇到这个问题了。我只是最终没有使用
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")
这似乎解决了我的问题...