【问题标题】:Is it possible to check on a InfluxDB database when a record is missing?缺少记录时是否可以检查 InfluxDB 数据库?
【发布时间】:2021-05-24 14:06:41
【问题描述】:

我有一个关于 InfluxQL 请求的问题。

问题是,我有一个数据库,我想在一个小时内不发送字节时获取我的设备的 id 或值 0。

这是我的数据库结构的示例

time                 bytes_in   id
----                 --------   --
2021-01-01T05:06:18Z 37         274 
2021-01-01T05:07:52Z 37         274
2021-01-01T19:55:37Z 37         274
2021-01-01T20:55:37Z 37         274
2021-01-01T21:08:25Z 37         274
2021-01-01T21:10:00Z 37         274
2021-01-01T21:55:37Z 37         274
2021-01-01T22:55:37Z 37         274
2021-01-01T23:55:37Z 37         274
2021-01-01T23:57:14Z 37         274

所以我有两个标签(时间和 ID)和一个字段(bytes_in)。当没有任何消息发送时,我尝试了不同的方法来获取我的 ID。

  1. 我试过这个:
SELECT  id, SUM(bytes_in) as sum FROM db where sum = 0 GROUP BY id, time(1h) 

但是我得到了一个错误:“不支持混合聚合和非聚合查询”。不明白为什么我在上面分组数据时不能选择id。

  1. 我尝试使用子查询检查我的总和何时等于 0
SELECT total FROM (SELECT SUM(bytes_in) as total FROM db WHERE ((time>= '2021-01-01') AND (time <= '2021-01-02')) GROUP BY id, time(1h)) WHERE total = 0;

但这没有任何回报。我试过没有第二个 WHERE 条件,但它是一样的,SELECT 只返回非空数据。

  1. 我尝试了 fill(0) 解决方案 (https://stackoverflow.com/a/52084689)。但是我的数据库很大,请求运行到内存不足的错误。

  2. 我尝试测试 SUM() 函数的返回值。

SELECT  SUM(bytes_in) as total FROM db WHERE ((time >= '2020-01-01') AND (time <= '2021-01-02') AND (SUM(bytes_in) = 0 )) GROUP BY prod_id,time(1h)  

但是随着请求返回错误:条件中的无效函数调用:sum(bytes_in)。有没有办法在 WHERE 子句中测试函数的结果?

如果你想自己尝试,这里是我关于女巫的数据库的一个微部分,你可以试试:

curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary 'db,id=274 bytes_in=37 1609477578000000000'
curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary 'db,id=274 bytes_in=37 1609477672000000000'
curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary 'db,id=274 bytes_in=37 1609530937000000000'
curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary 'db,id=274 bytes_in=37 1609534537000000000'
curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary 'db,id=274 bytes_in=37 1609535305000000000'
curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary 'db,id=274 bytes_in=37 1609535400000000000'
curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary 'db,id=274 bytes_in=37 1609538137000000000'
curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary 'db,id=274 bytes_in=37 1609541737000000000'
curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary 'db,id=274 bytes_in=37 1609545337000000000'
curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary 'db,id=274 bytes_in=37 1609545434000000000'

我希望我的解释足够清楚。

谢谢!

【问题讨论】:

    标签: influxdb missing-data influxql


    【解决方案1】:

    您可以使用show tag values from db with key="id" 获取所有id,使用SELECT SUM(bytes_in) FROM db WHERE time &gt; now()-1h GROUP BY id 获取Sum。如果id在过去一小时内有值,它将出现在选择结果中,您可以从结果中的标签区域获取id。如果您使用时间组,您可以在您正在搜索的“where子句”中获取序列。

    【讨论】:

    • 我不确定我是否完全理解您的回复。事情是当总和中没有时我正在寻找 id 。当没有发送数据时,我需要找到所有的 id。而且我不明白你是如何从总和选择中获得 id 的。非常感谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    相关资源
    最近更新 更多