如何从 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
注意:
- 对于凌晨 1 点的桶,即使灯开始和结束时处于打开状态,它在 60 分钟内也只有 10 次打开,所以该值很低 (10/60)
- 并且更重要的是,从凌晨 3 点到凌晨 4 点,桶的值为“1”,因为自上一个时间段以来灯一直亮着,即使这个时间段没有变化。这排除了在
GROUP BY TIME()
上使用简单聚合(例如 MEAN
),因为没有任何方法可以知道 empty/missing 桶是否对应于 On 或 Off 状态,因为它只取决于该时间段之前的最后报告值。
有没有办法在纯 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 中的外观:
这不是让它正常工作的完美方法,但我希望它能解决您的问题。
使用 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 |
注意:
- 对于凌晨 1 点的桶,即使灯开始和结束时处于打开状态,它在 60 分钟内也只有 10 次打开,所以该值很低 (10/60)
- 并且更重要的是,从凌晨 3 点到凌晨 4 点,桶的值为“1”,因为自上一个时间段以来灯一直亮着,即使这个时间段没有变化。这排除了在
GROUP BY TIME()
上使用简单聚合(例如MEAN
),因为没有任何方法可以知道 empty/missing 桶是否对应于 On 或 Off 状态,因为它只取决于该时间段之前的最后报告值。
有没有办法在纯 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 中的外观:
这不是让它正常工作的完美方法,但我希望它能解决您的问题。