Skip to main content
ClickHouse предоставляет несколько способов работы с временными рядами, позволяя агрегировать, группировать и анализировать точки данных за разные периоды времени. В этом разделе рассматриваются основные операции, которые обычно используются при работе с данными, привязанными ко времени. К распространённым операциям относятся группировка данных по временным интервалам, обработка пропусков во временных рядах и вычисление изменений между периодами времени. Эти операции можно выполнять, используя стандартный синтаксис SQL в сочетании со встроенными функциями ClickHouse для работы со временем. Мы рассмотрим возможности ClickHouse по выполнению запросов к временным рядам на примере набора данных Wikistat (данные о просмотрах страниц Википедии):
Давайте заполним эту таблицу 1 миллиардом записей:

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

Самая распространённая задача — агрегировать данные по периодам, например получить общее число хитов за каждый день:
Здесь мы использовали функцию toDate(), которая преобразует указанное время в тип date. Также можно выполнять группировку по часу и применять фильтр по конкретной дате:
Используемая здесь функция toStartOfHour() преобразует указанное время к началу часа. Вы также можете группировать по году, кварталу, месяцу или дню.

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

Мы можем выполнять группировку даже по произвольным интервалам, например по 5-минутным, с помощью функции toStartOfInterval(). Предположим, что мы хотим группировать по 4-часовым интервалам. Мы можем указать интервал группировки с помощью конструкции INTERVAL:
Или можно использовать функцию toIntervalHour()
В любом случае получаем следующие результаты:

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

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

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

Иногда нас интересует не начало интервалов (например, начало дня или часа), а сами интервалы окна. Допустим, мы хотим узнать общее количество hits для окна не по дням, а за 24-часовой период со смещением относительно 18:00. Мы можем использовать функцию date_diff(), чтобы вычислить разницу между опорным временем и временем каждой записи. В этом случае столбец day будет обозначать разницу в днях (например, 1 день назад, 2 дня назад и т. д.):
Последнее изменение 3 июля 2026 г.