【问题标题】:Retrieve all last points/records per tag in InfluxDB, without WHERE clause检索 InfluxDB 中每个标签的所有最后点/记录,没有 WHERE 子句
【发布时间】:2020-10-20 16:18:11
【问题描述】:

我有大约 1500 台设备,它们以随机频率将数据推送到我的 InfluxDB v1.8+ 实例。我正在寻找最有效的方法,至少在性能方面,为每个 device_id(标签)收集最后一个点。

为了简洁起见,此测量中的数据非常简单:

time, device_id (tag), usage (in bytes)
1593514228321002500, 'A12345', 32212254720

我保证每个点都填充了“使用”字段。这不是问题。因此,对于每个标签(device_id),拥有最新的点实际上是我想要的。

我目前的解决方案远非可扩展且效率不高,它首先列出所有 device_id:

$ show tag values on "my_database" with key = "device_id"

...然后遍历每个以获得最后一点:

$ select time, device_id, usage
    from @measurement
    where device_id = '@device_id'
    order by time desc
    limit 1

我的问题:我如何才能最有效地获取所有 device_ids (tag) 的最后点/记录,而不在 device_id 上提供 WHERE 子句?最好在一个命令中,这样我就可以删除 foreach 迭代。

同样的问题已被问到其他口味,for example here in MySQL。这个问题是 InfluxDB 特有的。

【问题讨论】:

    标签: sql influxdb influxql


    【解决方案1】:

    你可以试试这个。对任一字段使用 last()

    select last(usage), * from @measurement group by device_id;
    

    【讨论】:

    • 感谢@Sheeram K.,但这仍然是一个 device_id 谓词。问题是:如何为 所有设备 获取它,例如不必提供 device_id?
    • 试试select last(usage), * from @measurement group by device_id。并且可以选择添加where time > ... 来限制时间范围。
    • 好的。我认为您需要特定的 device_id。让我编辑我的答案。
    • @YuriLachin 就是这样! where time-clause 很好。如果你把它写成答案,我很乐意接受。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多