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

Занятие 35. Практикум 9

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

⚡ Кратко: что повторяем

Агрегирующие оконные функции считают итог по окну строк, но не сворачивают строки. PARTITION BY делит строки на группы, ORDER BY в окне включает накопление.

  • MIN/MAX/AVG(unit_price) OVER (PARTITION BY order_id) — агрегат по заказу.
  • SUM(quantity) OVER (ORDER BY date_received) — кумулятивная сумма.
  • SUM(...) OVER (PARTITION BY product_id ORDER BY date_received) — кумулятивный итог внутри группы.

📖 Агрегирующие оконные функции

К агрегирующим функциям SUM, AVG, MIN, MAX, COUNT добавляется ключевое слово OVER. Функция считает итог по набору строк (окну), но каждая исходная строка остаётся на своём месте.

Отличие от GROUP BY

GROUP BY order_id сворачивает строки заказа в одну итоговую строку. Оконная функция MIN(unit_price) OVER (PARTITION BY order_id) добавляет столбец с минимумом к каждой строке заказа.

Окно с PARTITION BY

Если в OVER указан только PARTITION BY, функция возвращает одно значение для всей группы. Это значение дублируется в каждую строку группы. Чтобы оставить только уникальные комбинации, используется SELECT DISTINCT.

Кумулятивные значения

Кумулятивная сумма накапливает значения от начала до текущей строки. Для этого в окне используется ORDER BY. Например, SUM(quantity) OVER (ORDER BY date_received) считает общее количество полученных товаров по дате.

Накопление внутри группы

Комбинация PARTITION BY и ORDER BY позволяет считать кумулятивный итог отдельно для каждой группы. Например, SUM(quantity * unit_cost) OVER (PARTITION BY product_id ORDER BY date_received) покажет накопленную стоимость поставок для каждого продукта.

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

  • Оконные функции часто заменяют самописные JOIN с подзапросами и делают запрос читаемее.
  • Если результат нужен в виде «одна строка на группу» — используйте GROUP BY; если нужны детальные строки + итог — используйте окно.
  • При кумулятивных расчётах всегда проверяйте, что в окне есть ORDER BY.