2016-12-29 4 views
1

Использование InfluxDB (v1.1) У меня есть требование, когда я хочу получить последнюю метку времени для определенного ключа. Независимо от того, какое измерение оно хранится и независимо от того, какое значение это было.Запросить самую последнюю временную метку (MAX/Last) для определенного ключа в Influx

Установка простая, где у меня три измерения: 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), но вопрос не фильтруется никаким полем/ключом. И это именно то, что я хочу: получение «последней» записи для конкретного ключа.

ответ

2

К сожалению, не будет одного запроса, который поможет вам получить то, что вы ищете. Вам придется немного работать на стороне клиента.

Запрос, который вы хотите,

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' 

Оттуда вы получите один с наибольшей отметкой времени

> select last(value), time from location where device_id = 'x'; select last(value), time from network where device_id = 'x'; select last(value),  time from usage where device_id = 'x'; 
name: location 
time    last 
----    ---- 
1483640697584904775 3 

name: network 
time    last 
----    ---- 
1483640714335794796 4 

name: usage 
time    last 
----    ---- 
1483640783941353064 4 
+0

Спасибо Майкл. Действительно, это решение для работы, поэтому я поддержал это. Однако для определения значения потребуется три вызова API - по одному для каждого измерения. Это все еще не очень эффективно. Кроме того, что более важно, в запросах, которые вы указываете, на самом деле требуется указать ; это то, что я не знаю заранее. Поэтому я еще не отметил это как ответ. Возможно, будущие версии Influx будут иметь аккуратное решение для этого. –

+0

Делает смысл. Если вы могли бы открыть проблему в репо на InfluxDB, требуя такого рода функциональные возможности, мы можем соответствующим образом спланировать его. –