Перейти к основному содержимому
Перейти к основному содержимому

Основные операции с временными рядами

ClickHouse предоставляет несколько способов работы с данными временных рядов, позволяя агрегировать, группировать и анализировать данные в разных временных интервалах. В этом разделе рассматриваются основные операции, которые обычно используются при работе с данными, основанными на времени.

Общие операции включают в себя группировку данных по временным интервалам, обработку разрывов в данных временных рядов и вычисление изменений между временными периодами. Эти операции могут выполняться с использованием стандартного SQL-синтаксиса в сочетании со встроенными временными функциями ClickHouse.

Мы собираемся исследовать возможности запросов ClickHouse для временных рядов с набором данных Wikistat (данные просмотра страниц Википедии):

Давайте заполним эту таблицу 1 миллиардом записей:

Агрегация по временным интервалам

Самым популярным требованием является агрегация данных на основе периодов, например, получение общего количества просмотров за каждый день:

Мы использовали функцию toDate(), которая преобразует указанное время в тип даты. В качестве альтернативы, мы можем группировать по часам и фильтровать по конкретной дате:

Функция toStartOfHour(), использованная здесь, преобразует указанное время в начало часа. Вы также можете группировать по году, кварталу, месяцу или дню.

Пользовательские временные интервалы

Мы можем также группировать по произвольным интервалам, например, по 5 минут с помощью функции toStartOfInterval().

Предположим, мы хотим группировать по 4-часовым интервалам. Мы можем указать интервал группировки с помощью команды INTERVAL:

Или мы можем использовать функцию toIntervalHour():

В любом случае, мы получим следующие результаты:

Заполнение пустых групп

Во многих случаях мы имеем дело с разреженными данными с отсутствующими интервалами. Это приводит к пустым интервалам. Рассмотрим следующий пример, где мы группируем данные по 1-часовым интервалам. Это выведет следующие статистические данные с некоторыми отсутствующими значениями:

ClickHouse предоставляет модификатор WITH FILL для решения этой проблемы. Это заполнит все пустые часы нулями, чтобы мы могли лучше понять распределение во времени:

Скользящие временные окна

Иногда мы не хотим иметь дело с началом интервалов (например, началом дня или часа), а с временными окнами. Предположим, мы хотим понять общее количество просмотров за окно, не основываясь на днях, а на 24-часовом периоде, смещенном с 18:00.

Мы можем использовать функцию date_diff() для вычисления разницы между эталонным временем и временем каждой записи. В этом случае столбец day будет представлять разницу в днях (например, 1 день назад, 2 дня назад и т.д.):