InfluxDB – популярная база данных временных рядов, которая отлично справляется с обработкой больших объемов данных с отметками времени. При работе с InfluxDB вы можете столкнуться со сценариями, в которых вам необходимо смешивать агрегированные и неагрегированные запросы, чтобы получить значимую информацию из ваших данных. В этой статье будут рассмотрены различные методы достижения этой цели, сопровождаемые разговорными объяснениями и примерами кода.
Метод 1: подзапросы
Один из способов смешивать агрегированные и неагрегированные запросы в InfluxDB — использование подзапросов. Подзапросы позволяют вкладывать один запрос в другой, позволяя выполнять агрегирование подмножества ваших данных. Вот пример:
SELECT non_aggregate_field
FROM (SELECT aggregate_function(aggregate_field) AS non_aggregate_field
FROM measurement
WHERE time > now() - 1h
GROUP BY time(10m))
В этом примере мы выполняем агрегацию по aggregate_fieldв течение последнего часа, а затем выбираем результирующий non_aggregate_fieldиз подзапроса.
Метод 2: язык Flux
InfluxDB 2.0 представляет язык Flux, который обеспечивает большую гибкость при смешивании агрегированных и неагрегированных запросов. Flux позволяет объединить операции преобразования и агрегирования данных в один запрос. Вот пример:
from(bucket: "my-bucket")
|> range(start: -1h)
|> filter(fn: (r) => r._measurement == "measurement")
|> aggregateWindow(every: 10m, fn: max, createEmpty: false)
|> map(fn: (r) => ({non_aggregate_field: r._value}))
|> yield(name: "non_aggregate_data")
В этом запросе Flux мы указываем сегмент, временной диапазон и измерение, которые хотим запросить, а затем применяем функциюагрегатного окна для расчета максимального значения в течение 10-минутных интервалов. Наконец, мы используем функцию карты для преобразования данных и получения результата.
Метод 3: непрерывные запросы
Другой подход к смешиванию агрегированных и неагрегированных запросов в InfluxDB заключается в использовании непрерывных запросов. Непрерывные запросы позволяют предварительно рассчитывать агрегаты и сохранять их в отдельном измерении, что упрощает их объединение с неагрегированными запросами. Вот пример:
CREATE CONTINUOUS QUERY cq_name ON mydb
BEGIN
SELECT aggregate_function(aggregate_field) AS non_aggregate_field
INTO mymeasurement
FROM mymeasurement
GROUP BY time(10m)
END
В этом примере мы создаем непрерывный запрос с именем cq_name, который вычисляет совокупное значение aggregate_fieldс интервалом в 10 минут и сохраняет его в mymeasurementизмерение. Это позволяет нам легко объединять агрегированные данные с неагрегированными запросами.
Смешивания агрегированных и неагрегированных запросов в InfluxDB можно добиться с помощью различных методов, таких как подзапросы, язык Flux и непрерывные запросы. Используя эти методы, вы можете получить более глубокое понимание и выполнить комплексный анализ данных временных рядов. Поэкспериментируйте с этими методами, чтобы найти подход, который лучше всего подходит для вашего случая использования, и раскрыть весь потенциал вашей базы данных InfluxDB.