在Influx

时间:2016-12-29 10:07:19

标签: influxdb

使用InfluxDB(v1.1),我有一个要求,我想获得特定密钥的最后一个入口时间戳。无论存储哪种测量值,无论其存储的值是多少。

设置很简单,我有三个测量值:locationnetworkusage
只有一个键: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)上有类似的讨论,但问题是没有按任何字段/键过滤。而这正是我想要的:获得最后一次'输入特定密钥。

3 个答案:

答案 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

因此,解决方案将是使用LIMITORDER 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,也建议使用这种方法。