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

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

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

Синтаксис

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

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

Следующие функции можно использовать только как оконные функции. Большинство из них — стандартные функции SQL; lagInFrame, leadInFrame и nonNegativeDerivative — расширения ClickHouse.

Примеры

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

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

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

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

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

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

Рамка GROUPS

Рамка GROUPS считает целые группы равных строк — наборы строк с одинаковым ключом ORDER BY — а не физические строки (ROWS) или значения ORDER BY (RANGE). N PRECEDING и N FOLLOWING отсчитывают N групп равных строк до и после группы равных строк текущей строки, при этом каждая включённая группа учитывается целиком. В приведённом ниже запросе используются одинаковые границы 1 PRECEDING AND 1 FOLLOWING для рамок ROWS, RANGE и GROUPS. Столбец order содержит повторяющиеся и непоследовательные значения, поэтому три режима охватывают разные строки:
Каждый режим по-разному интерпретирует границы:
  • ROWS считает физические строки, поэтому рамка окна включает не более трёх соседних строк: текущую и по одной с каждой стороны.
  • RANGE считает значения order, поэтому 1 PRECEDING и 1 FOLLOWING охватывают строки, чьё значение order отличается от значения текущей строки не более чем на 1. При разрывах в 10 ни одна соседняя строка не попадает в рамку, поэтому она содержит только строки с тем же значением order, что и у текущей строки.
  • GROUPS считает группы равных строк, поэтому 1 PRECEDING и 1 FOLLOWING всегда полностью включают соседние группы независимо от разрывов между значениями order.

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

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

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

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

Скользящее среднее (по 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_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
Последнее изменение 14 августа 2026 г.