【问题标题】:InfluxDB calculate for how long was a signal switched onInfluxDB 计算信号开启了多长时间
【发布时间】:2021-08-14 14:45:04
【问题描述】:

我对@9​​87654324@ 类型值进行了一些测量,并想计算在特定时间段内信号处于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 函数,但这似乎并没有让我有所了解。我也用flux 尝试过,但也在那里碰壁(那只是为了学术目的,我需要用 InfluxQL)。

我找到了this,但解决方案是使用INTEGRAL(这要求您的值是 0 或 1 而不是布尔值,甚至有人没有得到正确的值)并切换到 Timescale DB。

Influx 仍然不支持这一点让我感到非常震惊,这似乎是使用 influx 的数据类型最常见的用例之一。

如果有人有任何我可能遗漏的信息或想法,我将不胜感激。

【问题讨论】:

  • 你终于找到了相关的东西吗?我看起来一样。
  • @Thibaut 我已经使用子查询修补了一些东西,但为了做到这一点,您需要能够使用 1 和 0 而不是布尔值。如果这对你有用,你可以尝试这样的事情: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;

标签: influxdb influxql


【解决方案1】:

设法让某些东西正常工作,但为了做到这一点,您需要能够使用 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-15
    • 2017-11-25
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 2018-03-04
    • 2011-11-15
    • 1970-01-01
    相关资源
    最近更新 更多