В чём разница между агрегирующей и оконной функцией в SQL?

«В чём разница между агрегирующей и оконной функцией в SQL?» — вопрос из категории SQL и базы данных, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Агрегирующая функция (GROUP BY)

  • Применяется к группам строк, определённым предложением GROUP BY.
  • Результат: Каждая группа строк сворачивается в одну итоговую строку. Исходное количество строк в выводе сокращается.
  • Пример: Подсчёт суммы продаж по каждому отделу.
    SELECT department_id, SUM(sale_amount) AS total_sales
    FROM sales
    GROUP BY department_id;
    -- В результате будет по одной строке на каждый department_id.

Оконная функция (OVER)

  • Применяется к набору строк, связанных с текущей строкой ("окну"), определяемому предложением OVER().
  • Результат: Вычисление производится для каждой строки отдельно, не сокращая общее количество строк в результате. К исходным данным добавляется новый столбец.
  • Пример: Добавление к каждой строке продажи информации о средней цене в её отделе.
    SELECT employee_id, sale_amount, department_id,
       AVG(sale_amount) OVER (PARTITION BY department_id) AS avg_department_sale
    FROM sales;
    -- В результате будет столько же строк, сколько в таблице sales, но с новым столбцом avg_department_sale.
Ключевое отличие наглядно: Подход Сворачивает строки? Синтаксис Пример результата для 10 строк в 2-х отделах
Агрегация Да GROUP BY 2 строки (по одной на отдел)
Оконная функция Нет OVER(...) 10 строк (все исходные), но с новым вычисленным столбцом

Практическое применение оконных функций: ROW_NUMBER(), RANK(), LAG()/LEAD() для анализа временных рядов, вычисления скользящего среднего.