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

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

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

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

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

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

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

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

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

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

Пользовательские интервалы группировки

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

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

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

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

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

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

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

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

Иногда мы не хотим работать с началом интервалов (например, с началом дня или часа), а с оконными интервалами. Допустим, мы хотим понять общее количество попаданий за окно, а не по дням, а за 24-часовой период, смещенный от 6 вечера.

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