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

Стандартные оконные функции

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

Оконные функции, специфичные для ClickHouse

Также доступна следующая оконная функция, специфичная для ClickHouse:

nonNegativeDerivative(metric_column, timestamp_column[, INTERVAL X UNITS])

Вычисляет неотрицательную производную для заданного metric_column по timestamp_column. INTERVAL можно опустить; значение по умолчанию — INTERVAL 1 SECOND. Вычисляемое значение для каждой строки:
  • 0 для первой строки,
  • metricimetrici1timestampitimestampi1interval{\text{metric}_i - \text{metric}_{i-1} \over \text{timestamp}_i - \text{timestamp}_{i-1}} * \text{interval} для ii-й строки.

Синтаксис

  • PARTITION BY - определяет, как разбить результирующий набор на группы.
  • ORDER BY - определяет порядок строк внутри группы при вычислении aggregate_function.
  • ROWS or RANGE - определяет границы рамки окна, в пределах которой вычисляется aggregate_function.
  • WINDOW - позволяет нескольким выражениям использовать одно и то же определение окна.

Функции

Эти функции можно использовать только как оконные функции.
  • row_number() - Нумерует текущую строку в пределах её партиции, начиная с 1.
  • first_value(x) - Возвращает первое значение, вычисленное в пределах упорядоченной рамки окна.
  • last_value(x) - Возвращает последнее значение, вычисленное в пределах упорядоченной рамки окна.
  • nth_value(x, offset) - Возвращает первое значение, отличное от NULL, вычисленное для n-й строки (offset) в пределах упорядоченной рамки окна.
  • rank() - Присваивает текущей строке ранг в пределах её партиции с пропусками.
  • dense_rank() - Присваивает текущей строке ранг в пределах её партиции без пропусков.
  • lagInFrame(x) - Возвращает значение, вычисленное для строки, находящейся на указанное физическое смещение перед текущей строкой в пределах упорядоченной рамки окна.
  • leadInFrame(x) - Возвращает значение, вычисленное для строки, находящейся на указанное смещение после текущей строки в пределах упорядоченной рамки окна.

Примеры

Рассмотрим несколько примеров использования оконных функций.

Нумерация строк

Функции агрегации

Сравните зарплату каждого игрока со средней зарплатой в его команде.
Сравните зарплату каждого игрока с максимальной зарплатой в его команде.

Партиционирование по столбцу

Границы рамки окна

┌─part_key─┬─value─┬─order─┬─frame_values─┬─rn_1─┬─rn_2─┬─rn_3─┬─rn_4─┐ │ 1 │ 1 │ 1 │ [5,4,3,2,1] │ 5 │ 5 │ 5 │ 2 │ │ 1 │ 2 │ 2 │ [5,4,3,2] │ 4 │ 4 │ 4 │ 2 │ │ 1 │ 3 │ 3 │ [5,4,3] │ 3 │ 3 │ 3 │ 2 │ │ 1 │ 4 │ 4 │ [5,4] │ 2 │ 2 │ 2 │ 2 │ │ 1 │ 5 │ 5 │ [5] │ 1 │ 1 │ 1 │ 1 │ └──────────┴───────┴───────┴──────────────┴──────┴──────┴──────┴──────┘
┌─frame_values_1─┬─second_value─┐ │ [1] │ ᴺᵁᴸᴸ │ │ [1,2] │ 2 │ │ [1,2,3] │ 2 │ │ [1,2,3,4] │ 2 │ │ [2,3,4,5] │ 3 │ └────────────────┴──────────────┘

Примеры из практики

Следующие примеры показывают, как решать распространённые практические задачи.

Максимальная/общая зарплата по отделам

Нарастающий итог

Скользящее среднее (по 3 строкам)

insert into sensors values(‘cpu_temp’, ‘2020-01-01 00:00:00’, 87), (‘cpu_temp’, ‘2020-01-01 00:00:01’, 77), (‘cpu_temp’, ‘2020-01-01 00:00:02’, 93), (‘cpu_temp’, ‘2020-01-01 00:00:03’, 87), (‘cpu_temp’, ‘2020-01-01 00:00:04’, 87), (‘cpu_temp’, ‘2020-01-01 00:00:05’, 87), (‘cpu_temp’, ‘2020-01-01 00:00:06’, 87), (‘cpu_temp’, ‘2020-01-01 00:00:07’, 87);

Скользящее среднее (за 10 секунд)

Скользящее среднее (за 10 дней)

Температура хранится с точностью до секунды, но с помощью Range и ORDER BY toDate(ts) мы формируем рамку окна размером 10 единиц, и благодаря toDate(ts) такой единицей является день.
insert into sensors values(‘ambient_temp’, ‘2020-01-01 00:00:00’, 16), (‘ambient_temp’, ‘2020-01-01 12:00:00’, 16), (‘ambient_temp’, ‘2020-01-02 11:00:00’, 9), (‘ambient_temp’, ‘2020-01-02 12:00:00’, 9), (‘ambient_temp’, ‘2020-02-01 10:00:00’, 10), (‘ambient_temp’, ‘2020-02-01 12:00:00’, 10), (‘ambient_temp’, ‘2020-02-10 12:00:00’, 12), (‘ambient_temp’, ‘2020-02-10 13:00:00’, 12), (‘ambient_temp’, ‘2020-02-20 12:00:01’, 16), (‘ambient_temp’, ‘2020-03-01 12:00:00’, 16), (‘ambient_temp’, ‘2020-03-01 12:00:00’, 16), (‘ambient_temp’, ‘2020-03-01 12:00:00’, 16);

Ссылки

GitHub Issues

План начальной поддержки оконных функций приведён в этом issue. Все GitHub issues, связанные с оконными функциями, помечены тегом comp-window-functions.

Тесты

Эти тесты содержат примеры поддерживаемой в настоящее время грамматики: https://github.com/ClickHouse/ClickHouse/blob/master/tests/performance/window_functions.xml https://github.com/ClickHouse/ClickHouse/blob/master/tests/queries/0_stateless/01591_window_functions.sql

Документация Postgres

https://www.postgresql.org/docs/current/sql-select.html#SQL-WINDOW https://www.postgresql.org/docs/devel/sql-expressions.html#SYNTAX-WINDOW-FUNCTIONS https://www.postgresql.org/docs/devel/functions-window.html https://www.postgresql.org/docs/devel/tutorial-window.html

Документация MySQL

https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html https://dev.mysql.com/doc/refman/8.0/en/window-functions-usage.html https://dev.mysql.com/doc/refman/8.0/en/window-functions-frames.html
Последнее изменение 19 июня 2026 г.