MiddleКодИногдаЕщё не отвечали
Вычислите нарастающий итог зарплат по дате найма
Верните каждого сотрудника с нарастающей суммой зарплат, упорядоченной по дате найма.
-- Employee(id, name, salary, hire_date, dept_id)
-- напишите ваш запрос здесь
Напишите запрос.
Используйте оконный SUM с упорядоченной рамкой: SELECT id, name, salary, SUM(salary) OVER (ORDER BY hire_date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS running_total FROM Employee. Рамка накапливает от первой строки до текущей.
- ✗Использовать
GROUP BY(схлопывающий строки) вместо оконной функции - ✗Опускать
ORDER BYв окне, из-за чегоSUMвозвращает общий итог на строку - ✗Браться за self-join, когда оконная рамка куда проще
- →Почему пропуск
ORDER BYв окне превращает нарастающий итог в общий? - →Как
PARTITION BY dept_idменяет поведение нарастающего итога?
Оглавление
Задача
Верните каждого сотрудника из Employee с нарастающей суммой зарплат по дате найма.
Решение
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;
Ключевые моменты
- Оконный
SUMсORDER BY hire_dateнакапливает значения от первой строки до текущей. - Рамка
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROWявно задаёт нарастающий итог. PARTITION BY dept_idсбросил бы накопление в начале каждого отдела.
Оглавление