如何从 InfluxDB 获取时间间隔值报告

How to obtain time interval value reports from InfluxDB

使用 InfluxDB:有什么方法可以构建表示随时间持续存在的状态的字段值的分时段报告?理想情况下 InfluxQL query language

更具体地举个例子:假设测量包含报告灯泡状态(开/关)变化的点。它们可以是下例中的 0 和 1,也可以是任何其他值。例如:

time                   light
----                   -----
2022-03-18T00:00:00Z   1
2022-03-18T01:05:00Z   0
2022-03-18T01:55:00Z   0
2022-03-18T02:30:00Z   1
2022-03-18T04:06:00Z   0

结果应该是一个间隔列表,指示此灯在每个时间间隔(例如几小时)内是亮着还是灭着,或者它亮着的时间百分比。对于给定的示例,如果按小时分组,结果应为:

Hour Value
2022-03-18 00:00 1.00
2022-03-18 01:00 0.17
2022-03-18 02:00 0.50
2022-03-18 03:00 1.00
2022-03-18 04:00 0.10

注意:

有没有办法在纯 InfluxQL 中实现它,而无需检索潜在的大数据集(点)并在客户端中迭代它们?

我认为可以查询得到原始数据:

SELECT "light" FROM "test3" WHERE $timeFilter

其中“test3”是您的测量名称,$timeFilter 是从...到...时间段。 在这种情况下,我们需要使用一个子查询来填充我们的数据,让我们考虑将(分辨率)时间分组为 1s:

SELECT last("light") as "filled_light" FROM "test3" WHERE $timeFilter GROUP BY time(1s) fill(previous)

这个查询每 1 秒给我们一个 1/0 的值。我们将把它用作子查询。

注意:您应该被告知,这种方式不考虑 $timeFilter 中数据周期的开始是否已经开始亮起或熄灭。这种方式将不会在 $timeFilter.

内提供具有任何值的小时之前的任何数据

在下一步中,您应该对从子查询获得的数据使用 integral() 函数,如下所示:

SELECT integral("filled_light",1h) from (SELECT last("light") as "filled_light" FROM "test3" WHERE $timeFilter GROUP BY time(1s) fill(previous)) group by time(1h)

这是它在图表上的样子:

结果数据在 table 中的外观:

这不是让它正常工作的完美方法,但我希望它能解决您的问题。