Вопрос проверяет умение использовать оконные функции SQL для агрегации данных без группировки строк, что полезно для сохранения детализации записей.
В SQL оператор GROUP BY традиционно используется для агрегации данных по группам, сводя несколько строк в одну. Однако иногда требуется сохранить все исходные строки, добавив к каждой из них вычисленное среднее значение по её группе. Для этой цели идеально подходят оконные функции (window functions).
Оконные функции выполняют вычисления над набором строк, связанных с текущей строкой, но не сворачивают результат в одну строку на группу. Они работают с "окном" данных, определённым предложением OVER.
Основной синтаксис для расчёта среднего по группе:
SELECT
employee_id,
department_id,
salary,
AVG(salary) OVER (PARTITION BY department_id) AS avg_department_salary
FROM employees;В этом запросе:
AVG(salary) — агрегатная функция, используемая как оконная.OVER (PARTITION BY department_id) определяет окно: данные разбиваются на группы по department_id, и среднее вычисляется внутри каждой группы отдельно.Такой подход полезен в аналитических отчётах, где нужно сравнить индивидуальные показатели с групповыми. Например, можно быстро увидеть, зарплата какого сотрудника выше или ниже средней по отделу, не теряя детализации.
Оконные функции поддерживаются в большинстве современных СУБД: PostgreSQL, MySQL (с версии 8.0), SQL Server, Oracle.
Итог: Используйте оконные функции с PARTITION BY, когда нужно добавить агрегированные значения (как среднее) к детальным записям без свёртки строк, что часто требуется для аналитики и сравнений.