微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

缺少记录时是否可以检查 InfluxDB 数据库?

如何解决缺少记录时是否可以检查 InfluxDB 数据库?

我有一个关于 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'

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

谢谢!

解决方法

您可以使用 show tag values from db with key="id" 获取所有 id,使用 SELECT SUM(bytes_in) FROM db WHERE time > now()-1h GROUP BY id 获取 Sum。如果id在最后一小时有值,它会出现在select结果中,你可以从结果中的标签区域获取id。如果你使用时间组,当它存在于你正在搜索的“where子句”中时,你可以获得series。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。