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;