Концепция оконной функции и 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, но оконная функция делает это короче и без отдельного соединения: конкретная сумма продажи и итог по категории оказываются в одной строке результата.

