InfluxDB 计算信号打开了多长时间
InfluxDB calculate for how long was a signal switched on
我有一些 boolean
类型值的测量值,想计算在特定时间段内信号处于 true
状态的时间。
例如:
datetime
state
01.01.2021 01:00
true
01.01.2021 04:00
true
01.01.2021 05:30
false
02.01.2021 23:00
true
03.01.2021 01:30
false
05.01.2021 06:00
true
应该转换为:
datetime
duration(1h)
01.01.2021
4.5
02.01.2021
1
03.01.2021
1.5
04.01.2021
0
05.01.2021
18
我知道 influx
具有 ELAPSED
函数 returns 后续记录之间的时间间隔,但这似乎对我没有任何帮助。我也用 flux
尝试过,但也在那里碰壁(那只是为了学术目的,我需要用 InfluxQL 来实现)。
我找到了 this,但解决方案是使用 INTEGRAL
(这要求您的值是 0 或 1 而不是布尔值,甚至有人没有得到正确的值)并切换到时间刻度数据库。
令我震惊的是,Influx 仍然不支持这一点,这似乎是 influx 所使用的数据类型的最常见用例之一。
如果有人有任何我可能遗漏的信息或想法,我将不胜感激。
设法让一些东西工作,但为了做到这一点,您需要能够使用 1 和 0 而不是布尔值,这样您就可以将 INTEGRAL
函数与子查询结合使用。
SELECT INTEGRAL(value, 1h) as "integral_1h" FROM
(SELECT MEAN(value) AS
"value" FROM your_series_name WHERE (time >= '2021-01-
01T00:00:00+00:00'
AND time < '2021-01-06T00:00:00+00:00') GROUP BY time(1s)
fill(previous))
WHERE (time >= '2021-01-01T00:00:00+00:00' AND time < '2021-01-
06T00:00:00+00:00') GROUP BY time(1d) fill(null) ORDER BY time ASC;
我有一些 boolean
类型值的测量值,想计算在特定时间段内信号处于 true
状态的时间。
例如:
datetime | state |
---|---|
01.01.2021 01:00 | true |
01.01.2021 04:00 | true |
01.01.2021 05:30 | false |
02.01.2021 23:00 | true |
03.01.2021 01:30 | false |
05.01.2021 06:00 | true |
应该转换为:
datetime | duration(1h) |
---|---|
01.01.2021 | 4.5 |
02.01.2021 | 1 |
03.01.2021 | 1.5 |
04.01.2021 | 0 |
05.01.2021 | 18 |
我知道 influx
具有 ELAPSED
函数 returns 后续记录之间的时间间隔,但这似乎对我没有任何帮助。我也用 flux
尝试过,但也在那里碰壁(那只是为了学术目的,我需要用 InfluxQL 来实现)。
我找到了 this,但解决方案是使用 INTEGRAL
(这要求您的值是 0 或 1 而不是布尔值,甚至有人没有得到正确的值)并切换到时间刻度数据库。
令我震惊的是,Influx 仍然不支持这一点,这似乎是 influx 所使用的数据类型的最常见用例之一。
如果有人有任何我可能遗漏的信息或想法,我将不胜感激。
设法让一些东西工作,但为了做到这一点,您需要能够使用 1 和 0 而不是布尔值,这样您就可以将 INTEGRAL
函数与子查询结合使用。
SELECT INTEGRAL(value, 1h) as "integral_1h" FROM
(SELECT MEAN(value) AS
"value" FROM your_series_name WHERE (time >= '2021-01-
01T00:00:00+00:00'
AND time < '2021-01-06T00:00:00+00:00') GROUP BY time(1s)
fill(previous))
WHERE (time >= '2021-01-01T00:00:00+00:00' AND time < '2021-01-
06T00:00:00+00:00') GROUP BY time(1d) fill(null) ORDER BY time ASC;