【问题标题】:influxdb: calculating duration of boolean events?influxdb:计算布尔事件的持续时间?
【发布时间】:2018-03-04 05:40:54
【问题描述】:

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

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

我想计算在给定时间段内门打开了多长时间。 ELAPSED 函数让我很接近,但我不确定如何(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,有没有办法通过influxdb查询来做到这一点?

【问题讨论】:

  • 今天似乎不支持它 - stackoverflow.com/questions/27959196/…。缺乏本机查询支持也意味着无法在 Grafana 等可视化工具中显示此信息。我只是让它与客户端处理一起使用,并将额外的信息添加到可用于在 Grafana 中渲染的测量中。

标签: influxdb


【解决方案1】:

我也遇到了这个问题,我想总结一个标志打开的持续时间,这在时间序列库的信号处理中很常见,但是 influxdb 似乎并不能很好地支持这个.我尝试使用值为 1 的标志进行 INTEGRATE,但它似乎没有给我正确的值。最后,我只需要计算我的数据源中的间隔,将它们作为一个单独的字段发布到 influxdb 中并总结它们。这种方式效果更好。

【讨论】:

    【解决方案2】:

    这是迄今为止我发现的最接近的:

    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
    

    我是 influx 的新手,所以请告诉我今天这是否是一种糟糕的做事方式。我也没有测试我在这里写的例子。

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题。在用 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)
      

      【讨论】:

      • 非常好!过去我曾使用过 timescaledb,但当时我对缺乏数据保留政策感到沮丧。自从我上次查看以来,情况似乎发生了变化。
      • 看起来 InfluxDB 2 有一个原生解决方案:docs.influxdata.com/influxdb/v2.0/query-data/flux/…
      猜你喜欢
      • 2015-03-13
      • 2019-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-16
      • 2018-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多