Вычислить нарастающий итог зарплат по дате найма
Таблица Employee(id, name, hire_date, salary, dept_id). Верните каждого сотрудника с нарастающим (кумулятивным) итогом зарплат в порядке hire_date.
Требования:
- итог каждой строки = сумма
salaryвсех сотрудников, нанятых не позже этой строки - результат нарастает по строкам, а не один общий итог и не сумма группы по дате
- отсортируйте вывод по
hire_date
SELECT id, name, hire_date, salary,
/* нарастающий итог здесь */ AS running_total
FROM Employee
-- ваш запрос здесь
Напишите запрос.
Используйте оконную SUM(salary) OVER (ORDER BY hire_date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW). OVER ... ORDER BY делает агрегат нарастающим, а явная рамка суммирует каждую строку вплоть до текущей. Добавьте PARTITION BY dept_id для нарастающего итога по отделу.
- ✗Использовать
GROUP BY hire_dateи получать суммы по дате, а не нарастающий итог - ✗Опускать
ORDER BYвOVER, из-за чегоSUMсуммирует всю партицию - ✗Думать, что оконная рамка не может ссылаться на все предыдущие строки
- →Что возвращает
SUM(...) OVER (ORDER BY ...)без явной рамкиROWS? - →Как
PARTITION BY dept_idменяет нарастающий итог?
Задача
Вычислить нарастающий итог зарплат в порядке даты найма.
SELECT id, name, hire_date, salary,
SUM(salary) OVER (ORDER BY hire_date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
AS running_total
FROM Employee
ORDER BY hire_date;
Как это работает
Это кумулятивная агрегация через оконную функцию. Ключевые части OVER (...):
ORDER BY hire_dateпревращает обычныйSUMв нарастающий: для каждой строки окно охватывает строки от начала до текущей в этом порядке;ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW— явная рамка: «все строки от первой до текущей включительно». Это даёт сумму всех зарплат сотрудников, нанятых не позже текущего.
Без ORDER BY в OVER функция суммировала бы всю партицию одинаково для каждой строки.
⚠️ Для нарастающего итога внутри отдела добавьте PARTITION BY dept_id — счёт сбросится на границе каждого отдела.