昨日在使用InfluxDB的last() 函数查询一组数据时发现了一些问题。
根据官方文档说明:
last()函数从输入表中返回最后一个非空记录。
用于验证值是否存在的列。如果该列在最后一条记录中为空,则last()返回具有非空值的前一条记录。默认为"_value"。
所以我理所应当认为只获取查询时间范围的最后一条(事实不是这样的)
详细过程如下
flux如下 range时间范围 start为 当前时间向前24小时
from(bucket: "MDCS") |> range(start: -24h) |> filter(fn: (r) =>
r["_measurement"] == "mqtt_consumer" and r._field == "v_03" and r.topic ==
"mdc") |> last()
查询出两条数据
节点A的数据为 2557381
节点B的数据为 2555926
导出csv表格显示此数据的时间,很明显不是最后一条
A设备:(注意看左侧table序号)
B设备:(注意看左侧table序号)
当我将范围时间时间分别更改为 range(start: -2h);1m;1h;2h;5h 后 这个数值是正确最后一条数据, 那么为什么 范围的起始时间加大
last()就不是最后一条数据了?
根据导出的原始数据时间我们发现last()查询出来的值都为8月6号的23:59分,都是时间范围起始当天的最后一条数据,这一点很奇怪,官方文档并没有说明。
按理来说结果会返回每个表的最后一条,但是根据上面的过程发现,last()返回的结果并不是单个表最后一个数据而是当天的最后一条??(这也是我觉得有问题的关键点!)
在网上搜索相关问题没有任何答案。
于是我再 github 的问题区找到了类似的问题
我尝试了一下:
加入了 group()
from(bucket: "MDCS") |> range(start: -24h) |> filter(fn: (r) =>
r["_measurement"] == "mqtt_consumer" and r._field == "v_03" and r.topic ==
"mdc") |> group(columns:["mac","_field"]) |> last()
再次查询发现结果正确了无论调整 range起始时间范围有多大都会取最后一条数据
总结:对于此问题,并没有找到真正的问题所在,一切看着好似都很正常,但查询出来却是错误的可能怀疑是bug,或者官方设定last()只能按日粒度进行查询但文档没有说明?在这里不得而知了,大家如有知道真正原因的可以留言或者评论告诉我。
不过使用group后确实可以解决问题,但查询性能也收到了略微影响。