使用InfluxDB(v1.1),我有一个要求,我想获得特定密钥的最后一个入口时间戳。无论存储哪种测量值,无论其存储的值是多少。
设置很简单,我有三个测量值:location
,network
和usage
。
只有一个键:device_id
。
在伪代码中,这将是:
# notice the lack of a FROM clause on measurement here...
SELECT MAX(time) WHERE 'device_id' = 'x';
问题:查询此问题的最有效方式是什么?
我想要这个的原因是会有一个分散的同步过程。有些设备可能在过去一小时内已更新,而其他设备尚未在几个月内更新。能够得到一个独特的"最后更新"设备(密钥)的时间戳将允许我更有效地将新点存储到Influx。
我还注意到InfluxDB's GitHub repo (#5793)上有类似的讨论,但问题是没有按任何字段/键过滤。而这正是我想要的:获得最后一次'输入特定密钥。
答案 0 :(得分:8)
不幸的是,不会有单一查询可以帮助您找到您想要的东西。你必须在客户端做一些工作。
您想要的查询是
asd1234
您需要为每次测量运行此查询。
SELECT last(<field name>), time FROM <measurement> WHERE device_id = 'x'
从那里你将获得时间戳最长的那个
SELECT last(<field name>), time FROM location WHERE device_id = 'x'
SELECT last(<field name>), time FROM network WHERE device_id = 'x'
SELECT last(<field name>), time FROM usage WHERE device_id = 'x'
答案 1 :(得分:4)
我尝试了这个,它在一个命令中对我有用:
SELECT last(<field name>), time FROM location, network, usage WHERE device_id = 'x'
我得到的结果:
name: location
time last
---- ----
1483640697584904775 3
name: network
time last
---- ----
1483640714335794796 4
name: usage
time last
---- ----
1483640783941353064 4
答案 2 :(得分:2)
tl; dr; 如果度量具有多个字段并且字段具有NULL值,则 first()和 last()选择器将无法一致工作。最有效的解决方案是使用这些查询
第一:
:Bearer
最后一个:
SELECT * FROM <measurement> [WHERE <tag>=value] LIMIT 1
说明:
如果测量中只有一个字段,则建议的解决方案将起作用,但是如果您有多个字段并且值可以为NULL,则 first() >和 last() 选择器不能始终如一地工作,并且可能为每个字段返回不同的时间戳。例如,假设您具有以下数据集:
SELECT * FROM <measurement> [WHERE <tag>=value] ORDER BY time DESC LIMIT 1
在这种情况下查询
time fieldKey_1 fieldKey_2 device
------------------------------------------------------------
2019-09-16T00:00:01Z NULL A 1
2019-09-16T00:00:02Z X B 1
2019-09-16T00:00:03Z Y C 2
2019-09-16T00:00:04Z Z NULL 2
将返回
SELECT first(fieldKey_1) FROM <measurement> WHERE device = "1"
,并且对first(fieldKey_2)的相同查询将返回不同的时间
time fieldKey_1
---------------------------------
2019-09-16T00:00:02Z X
使用 last 查询时,也会发生类似的问题。
如果您想知道,它不会查询“ first(*)”,因为您会在结果中获得“ epoch-0”时间,例如:
time fieldKey_2
---------------------------------
2019-09-16T00:00:01Z A
因此,解决方案将是使用LIMIT和ORDER BY的组合进行查询。 例如,您可以首次使用以下值:
time first_fieldKey_1 first_fieldKey_2
-------------------------------------------------------------
1970-01-01T00:00:00Z X A
最后一个可以使用的
SELECT * FROM <measurement> [WHERE <tag>=value] LIMIT 1
它安全且快速,因为它将在索引上进行中继。
很好奇地提到thread linked in the opening post中提到了这种更为简单的方法,但该方法却被放弃了。也许只是被遗忘了。
这里有一个关于主题的thread in InfluxData blogs,也建议使用这种方法。