Influxdb:计算布尔事件的持续时间?

时间:2017-09-22 15:24:48

标签: influxdb

我在一个来自门传感器的Influxdb数据库中有数据。这是一个布尔传感器(门打开(值为false)或关闭(值为true)),表格如下:

name: door
--------------
time            value
1506026143659488953 true
1506026183699139512 false
1506026751433484237 true
1506026761473122666 false
1506043848850764808 true
1506043887602743375 false

我想计算在给定时间内门打开的时间。 ELAPSED函数让我接近,但我不确定如何(a)将其限制为初始值为false的那些区间,或者(b)识别&# 34;开"来自select elapsed(value, 1s) from door

之类的输出的间隔

我希望我可以做类似的事情:

select elapsed(value, 1s), first(value) from door

但这并没有给我任何有用的东西:

name: door
--------------
time            elapsed first
0               true
1506026183699139512 40  
1506026751433484237 567 
1506026761473122666 10  
1506043848850764808 17087   
1506043887602743375 38  

我希望有更多的内容:

name: door
--------------
time            elapsed first
1506026183699139512 40  true
1506026751433484237 567 false
1506026761473122666 10  true
1506043848850764808 17087   false
1506043887602743375 38  true

没有自己提取数据并在例如python,有没有办法通过Influxdb查询来做到这一点?

4 个答案:

答案 0 :(得分:2)

我一直在寻找相同的功能。 <{3}}和Github上的类似问题仍有待解答。

我想主要使用它来使用连续查询来聚合和存档旧数据。我正在考虑在使用一个CQ的中间测量中聚合一些数据 - 可能使用elapsed() - 并且使用另一个CQ进一步处理它。但即使是这一系列的思路也让我无处可去。

答案 1 :(得分:0)

我也遇到了这个问题,我想总结一个标记打开的持续时间,这在时间序列库中的信号处理中很常见,但是influxdb似乎并不太支持。我尝试使用值1的标志进行INTEGRATE,但似乎并没有给我正确的值。最后,我求助于仅计算数据源中的间隔,将其作为单独的字段发布到influxdb中,然后进行汇总。这样效果更好。

答案 2 :(得分:0)

这是我到目前为止找到的最接近的

https://community.influxdata.com/t/storing-duration-in-influxdb/4669

这个想法是将布尔事件存储为01,并使用两个具有一个时差单位的条目存储每个状态变化。看起来像这样:

name: door
--------------
time            value
1506026143659488953 1
1506026183699139511 1
1506026183699139512 0
1506026751433484236 0
1506026751433484237 1
1506026761473122665 1
1506026761473122666 0
1506043848850764807 0
1506043848850764808 1
1506043887602743374 1
1506043887602743375 0

然后应该可以使用这样的查询:

SELECT integral(value) FROM "door" WHERE time > x and time < y

我是新手,所以请告诉我今天这是否做事不好。我也没有测试我在这里编写的示例。

答案 3 :(得分:0)

我有同样的问题。在使用InfluxDB碰到这堵墙并且在这里或其他地方找不到干净的解决方案之后,我最终切换到TimescaleDB(基于PostgreSQL)并使用SQL window function来解决它,使用lag()计算以前的时间值。

对于OP的数据集,可能的解决方案如下所示:

SELECT
  "time",
  ("time" - lag("time") OVER (ORDER BY "time"))/1000000000 AS elapsed,
  value AS first
FROM door
ORDER BY 1
OFFSET 1;  -- omit the initial zero value

输入:

CREATE TEMPORARY TABLE "door" (time bigint, value boolean);
INSERT INTO "door" VALUES
  (1506026143659488953, true),
  (1506026183699139512, false),
  (1506026751433484237, true),
  (1506026761473122666, false),
  (1506043848850764808, true),
  (1506043887602743375, false);

输出:

        time         | elapsed | first 
---------------------+---------+-------
 1506026183699139512 |      40 | f
 1506026751433484237 |     567 | t
 1506026761473122666 |      10 | f
 1506043848850764808 |   17087 | t
 1506043887602743375 |      38 | f
(5 rows)