InfluxDB - получение только последнего значения в запросе

Можно ли запрашивать только последнее значение (или n-е значение) результатов запроса?

Например, в запросе:

SELECT value FROM response_times WHERE time > now() - 1h limit 1000;

Можно получить только последнее значение, т.е. еще более далекое во времени (возможно, 1000-й элемент)?

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

Ответ 1

В API, посмотрите сначала/последний, чтобы выбрать первую или последнюю запись столбца. У вас также есть верх/низ, чтобы выбрать более одной записи

[править] top/bottom, похоже, возвращает самые высокие/самые низкие значения временного кадра

Ответ 2

Если вы используете InfluxDB 0.8, не используйте FIRST() или LAST(), если у вас нет GROUP BY, потому что он очень медленный :(

Поэтому, если вы хотите получить эти значения, вы должны их использовать:

Первое значение:

SELECT * FROM <SERIES> GROUP BY * ORDER BY ASC LIMIT 1

Последнее значение:

SELECT * FROM <SERIES> GROUP BY * ORDER BY DESC LIMIT 1

Не удаляйте GROUP BY *, потому что тогда возможно, что вы получите неожиданные значения.

Ответ 3

SELECT last(value) FROM response_times WHERE time > now() - 1h;

Это должно вернуть последнее значение столбца.

Однако, если вы хотите, вы можете разделить последовательность на более мелкие части и выбрать последнее значение. Например:

 SELECT last(value) FROM response_times WHERE time > now() - 1h GROUP BY time(60s);

Он разделит последовательность в 60-секундных фрагментах и ​​подберет для каждого фрагмента самое последнее значение.

Ответ 4

SELECT * FROM <SERIES> ORDER BY ASC LIMIT 1

Ответ 5

Там нет ошибок или каких-либо проблем с LIMIT. Да, есть один, но это про SLIMIT (Series Limit). LIMIT можно смело использовать для получения первых n записей.

Короче говоря, синтаксис для LIMIT:

SELECT_clause [INTO_clause] FROM_clause [WHERE_clause] [GROUP_BY_clause] [ORDER_BY_clause] LIMIT <N>

Синтаксис для SLIMIT:

SELECT_clause [INTO_clause] FROM_clause [WHERE_clause] GROUP BY *[,time(<time_interval>)] [ORDER_BY_clause] SLIMIT <N>

Вы видите, что предложение GROUP BY является [необязательным] в LIMIT.

Для подробного объяснения использования LIMIT и SLIMIT, вот документ версии 1.5. И вот постоянный вопрос о SLIMIT.

Ответ 6

Вот конкретный пример, предположим, у нас есть данные:

> select *,tag from measurement
name: measurement
time                 field_1    tag_1
----                 -------    ------
2019-05-15T03:07:52Z 100      A
2019-05-15T03:07:52Z 101      B
2019-05-15T03:09:52Z 100      A
2019-05-15T03:09:52Z 101      B

и вы хотели бы взять последние два столбца (последние записи на tag_1), тогда вы можете сделать это:

> select last(field_1),* from measurement group by *
name: measurement
tags: tag_1=A
time                 last     field_1 
----                 ----    ------- 
2019-05-15T03:09:52Z 100        100     

name: measurement
tags: tag_1=B
time                 last  field_1 
----                 ----  ------- 
2019-05-15T03:09:52Z 101    101 

а также визуализация на графане, она всегда будет показывать последние записи по тегу enter image description here