【发布时间】:2021-08-14 14:45:04
【问题描述】:
我对@987654324@ 类型值进行了一些测量,并想计算在特定时间段内信号处于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;