Оконные функции

Концепция оконной функции и OVER с PARTITION BY

Содержание курса

В прошлом уроке вы научились разбивать сложный запрос на именованные шаги с помощью CTE. Сегодня появится новая конструкция, которая работает иначе, чем всё, что вы видели раньше: она считает агрегаты, но не уничтожает детальные строки.

Оконная функция: агрегат без схлопывания строк и отличие от GROUP BY

Когда вы применяете GROUP BY category, база данных берёт все строки одной категории и сворачивает их в единственную строку-итог. Детали — каждый отдельный sale_id, каждый конкретный amount — исчезают: в результате остаётся ровно столько строк, сколько уникальных значений у столбца группировки. Это не побочный эффект, а суть операции.

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

Разница хорошо видна на числах. Возьмём таблицу sales с пятью строками и двумя категориями: три строки с «Книгами» и две с «Электроникой».

  • GROUP BY category вернёт 2 строки — по одной на категорию.
  • Оконная функция вернёт 5 строк — все исходные записи, у каждой из которых появится дополнительный столбец с суммой по её категории.

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

Когда это нужно на практике? Представьте, что нужно показать каждую продажу вместе с долей, которую она занимает в своей категории. В одном агрегирующем SELECT с GROUP BY детальные строки исчезнут. Вернуть детали и групповой итог в одном SQL-запросе можно через агрегирующий CTE или подзапрос с последующим JOIN, но оконная функция делает это короче и без отдельного соединения: конкретная сумма продажи и итог по категории оказываются в одной строке результата.

Анимация заполнения category_total оконной суммой для каждой категории при сохранении всех пяти исходных строк
Оконная функция добавляет итог, не схлопывая строки

Начать заново?

Помощник начнёт новый диалог по этой задаче. Текущая переписка останется в истории до конца срока хранения.

О переписке

Можно приложить до трёх фото PNG, JPEG или WebP по 5 МБ.

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

Проверка решения остаётся отдельным действием.