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]()