[{"createTime":1735734952000,"id":1,"img":"hwy_ms_500_252.jpeg","link":"https://activity.huaweicloud.com/cps.html?fromacct=261f35b6-af54-4511-a2ca-910fa15905d1&utm_source=V1g3MDY4NTY=&utm_medium=cps&utm_campaign=201905","name":"华为云秒杀","status":9,"txt":"华为云38元秒杀","type":1,"updateTime":1735747411000,"userId":3},{"createTime":1736173885000,"id":2,"img":"txy_480_300.png","link":"https://cloud.tencent.com/act/cps/redirect?redirect=1077&cps_key=edb15096bfff75effaaa8c8bb66138bd&from=console","name":"腾讯云秒杀","status":9,"txt":"腾讯云限量秒杀","type":1,"updateTime":1736173885000,"userId":3},{"createTime":1736177492000,"id":3,"img":"aly_251_140.png","link":"https://www.aliyun.com/minisite/goods?userCode=pwp8kmv3","memo":"","name":"阿里云","status":9,"txt":"阿里云2折起","type":1,"updateTime":1736177492000,"userId":3},{"createTime":1735660800000,"id":4,"img":"vultr_560_300.png","link":"https://www.vultr.com/?ref=9603742-8H","name":"Vultr","status":9,"txt":"Vultr送$100","type":1,"updateTime":1735660800000,"userId":3},{"createTime":1735660800000,"id":5,"img":"jdy_663_320.jpg","link":"https://3.cn/2ay1-e5t","name":"京东云","status":9,"txt":"京东云特惠专区","type":1,"updateTime":1735660800000,"userId":3},{"createTime":1735660800000,"id":6,"img":"new_ads.png","link":"https://www.iodraw.com/ads","name":"发布广告","status":9,"txt":"发布广告","type":1,"updateTime":1735660800000,"userId":3},{"createTime":1735660800000,"id":7,"img":"yun_910_50.png","link":"https://activity.huaweicloud.com/discount_area_v5/index.html?fromacct=261f35b6-af54-4511-a2ca-910fa15905d1&utm_source=aXhpYW95YW5nOA===&utm_medium=cps&utm_campaign=201905","name":"底部","status":9,"txt":"高性能云服务器2折起","type":2,"updateTime":1735660800000,"userId":3}]
昨日在使用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后确实可以解决问题,但查询性能也收到了略微影响。