流入DB:计算布尔事件的持续时间



我从门传感器中有数据库中的数据。这是一个布尔传感器(门是打开的(值为 false),要么是关闭的(值为 true)),而且表看起来像:

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

我想计算在给定时间内打开门的时间。经过的函数使我接近,但是我不确定如何(a)将其限制在 false的那些间隔中,或(b)从诸如 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,有什么方法可以通过infuxdb查询?

我也遇到了这个问题,我想总结旗帜上的时间的持续时间,这在时间序列库中的信号处理中很常见,但是influxdb只是似乎很好地支持了这一点。我尝试使用一个值1的标志集成,但似乎并没有给我正确的值。最后,我求助于计算数据源的间隔,将这些间隔发布为InfluxDB中的单独字段,并将其求和。这样可以更好地工作。

这是我到目前为止发现的最接近的:

https://community.influxdata.com/t/storing-duration-infration-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

我是涌入的新手,所以让我知道这是否是今天做事的不好方式。我也没有测试过我在这里写的示例。

我也有同样的问题。在使用InfluxDB撞到这堵墙并在此处或其他地方找不到干净的解决方案后,我最终切换到TimeScaledB(基于PostgreSQL)并使用SQL窗口函数求解它,并使用lag()将Delta计算为先前的时间值。p>对于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)

最新更新