← К оглавлению занятия

Занятие 33. Оконные функции. Общие концепции

📁 Блок: SQL / MySQL / Оконные функции ⏱️ Время изучения: ~90 мин 🎯 Сложность: Средняя

⚡ Кратко: суть темы

Оконная функция вычисляет значение для текущей строки на основе окна — набора строк, определённого через OVER.

  • GROUP BY сворачивает строки в группы; оконная функция сохраняет каждую строку.
  • PARTITION BY делит данные на разделы, внутри которых функция работает независимо.
  • ORDER BY внутри OVER задаёт порядок строк в окне, а не в результате.

Что запомнить: оконная функция добавляет столбец, не удаляя исходные строки.

Частая ошибка: думать, что PARTITION BY обязателен — окно может охватывать все строки.

📖 Теория оконных функций

Что такое оконная функция

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

Главное отличие от агрегирующей функции: оконная функция не объединяет записи в одну, как GROUP BY, а сохраняет независимость каждой строки.

Выражение OVER

OVER — это выражение, которое определяет, как разделить записи, которые обработает функция. Внутри OVER могут находиться операторы PARTITION BY и ORDER BY.

PARTITION BY

PARTITION BY — оператор, который разделяет записи на группы, или разделы (partitions), в зависимости от значения выбранного поля. Записи с одинаковыми значениями в указанном столбце оказываются в одном окне, и для каждого окна рассчитывается свой результат.

По действию PARTITION BY похож на GROUP BY, но при этом сохраняются все строки, а не сводятся в одну строку на группу.

ORDER BY внутри OVER

ORDER BY внутри OVER определяет порядок строк в каждой группе (partition) перед применением оконной функции. Это важно для функций, чувствительных к порядку (например, накопительная сумма или рейтинг).

⚠️ ORDER BY внутри OVER — это не тот же ORDER BY, что в конце запроса. Первый сортирует строки в окне, второй — итоговый результат.

Основные различия GROUP BY и оконных функций

КритерийGROUP BYОконные функции
Цель Группировка строк таблицы по одному или нескольким столбцам для агрегатных вычислений. Вычисления на основе набора строк, определённого окном. Каждая строка остаётся в результате.
Результат Одна строка для каждой группы. Все строки группы объединяются. Одна строка для каждой исходной строки. Результат функции добавляется как новый столбец.
Число строк Уменьшается до числа групп. Не меняется.

Основные концепции оконных функций

Окно (Window)

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

Представьте окно как рамку, которая охватывает набор строк для выполнения вычислений. Эта рамка перемещается по строкам, и результат вычислений может изменяться в зависимости от строк, находящихся внутри окна.

PARTITION BY как «коробки»

Если представить таблицу как набор коробок (отделов), то PARTITION BY определяет, как будут упакованы коробки. Оконные функции будут применяться внутри каждой коробки отдельно.

ORDER BY как упорядочение внутри коробки

Порядок строк внутри каждой «коробки» можно задать через ORDER BY внутри OVER: например, по дате, зарплате, идентификатору и т.д. Это влияет на то, какие строки попадают в окно до и после текущей.

✨ Современные практики

  • Используйте оконные функции для аналитики вместо сложных самообъединений таблиц.
  • Разделяйте большие наборы данных на разделы через PARTITION BY, чтобы вычисления выполнялись независимо по категориям.
  • Не смешивайте сортировку окна с сортировкой результата: явно указывайте финальный ORDER BY в конце запроса, если нужен определённый вывод.