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

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

ClickHouse поддерживает стандартный SQL-синтаксис для окон и оконных функций. В таблице ниже показано, какие возможности поддерживаются в настоящее время:
ВозможностьПоддерживается?Комментарий
Спецификация окна ad hoc (count(*) OVER (PARTITION BY id ORDER BY time DESC))
Выражения с оконными функциями, например (count(*) OVER ()) / 2
Предложение WINDOW (SELECT ... FROM table WINDOW w AS (PARTITION BY id))
Рамка окна ROWS
Рамка окна RANGEИспользуется по умолчанию, если рамка окна явно не указана (RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW).
Синтаксис INTERVAL для рамки DateTime RANGE OFFSETВместо этого укажите количество секунд (RANGE работает с любым числовым типом).
Рамка окна GROUPS
Вычисление агрегатных функций по рамке окна (sum(value) OVER (ORDER BY time))Поддерживаются все агрегатные функции.
rank(), dense_rank()/denseRank(), row_number()
percent_rank()/percentRank()Эффективно вычисляет относительное положение значения в пределах партиции. Заменяет более многословный и вычислительно затратный ручной SQL-расчёт: ifNull((rank() OVER (PARTITION BY x ORDER BY y) - 1) / nullif(count(1) OVER (PARTITION BY x) - 1, 0), 0).
cume_dist()Вычисляет кумулятивное распределение значения в группе значений. Возвращает процент строк со значениями, меньшими или равными значению в текущей строке.
lag/lead(value, offset)Также можно использовать один из следующих обходных вариантов:
1) any(value) OVER (... ROWS BETWEEN <offset> PRECEDING AND <offset> PRECEDING) или FOLLOWING вместо PRECEDING для lead
2) lagInFrame/leadInFrame — это аналогичные функции, но они учитывают рамку окна. Чтобы получить поведение, идентичное lag/lead, используйте ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING.
ntile(buckets)Укажите окно, например: (PARTITION BY x ORDER BY y ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING).

Синтаксис

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

Функции, доступные только как оконные функции

Следующие функции можно использовать только как оконные функции. Большинство из них — стандартные функции SQL; lagInFrame, leadInFrame и nonNegativeDerivative — расширения ClickHouse.
FunctionDescription
row_number()Пронумеровать текущую строку в пределах её партиции, начиная с 1.
first_value(x)Вернуть первое значение, вычисленное в пределах упорядоченной рамки окна.
last_value(x)Вернуть последнее значение, вычисленное в пределах упорядоченной рамки окна.
nth_value(x, offset)Вернуть первое значение, отличное от NULL, вычисленное для n-й строки (offset) в пределах упорядоченной рамки окна.
rank()Присвоить ранг текущей строке в пределах её партиции с пропусками.
dense_rank()Присвоить ранг текущей строке в пределах её партиции без пропусков.
lagInFrame(x)Вернуть значение, вычисленное для строки, находящейся на заданное физическое смещение перед текущей строкой в пределах упорядоченной рамки окна.
leadInFrame(x)Вернуть значение, вычисленное для строки, находящейся на заданное число строк после текущей строки в пределах упорядоченной рамки окна.
nonNegativeDerivative(metric_column, timestamp_column[, INTERVAL X UNITS])Вычислить неотрицательную производную metric_column по timestamp_column. Специфична для ClickHouse.

Примеры

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

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

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

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

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

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

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

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

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

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

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

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

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

Температура хранится с точностью до секунд, но с помощью Range и ORDER BY toDate(ts) мы формируем рамку окна размером 10 единиц, и благодаря toDate(ts) этой единицей является день.

Ссылки

GitHub Issues

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

Тесты

Эти тесты содержат примеры поддерживаемой в настоящее время грамматики: https://github.com/ClickHouse/ClickHouse/blob/master/tests/performance/window&#95;functions.xml https://github.com/ClickHouse/ClickHouse/blob/master/tests/queries/0&#95;stateless/01591&#95;window&#95;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
Последнее изменение 2 июля 2026 г.