Показать зарплату каждого сотрудника рядом со средней по его отделу в той же строке
Таблица employees(employee_id, department, salary). Для каждого сотрудника верните его зарплату и среднюю зарплату по его отделу, обе в одной строке. Каждый сотрудник должен присутствовать — не сворачивайте результат до одной строки на отдел.
-- одна строка на сотрудника: зарплата и средняя по его отделу
Напишите запрос.
Берут оконный агрегат, а не GROUP BY: AVG(salary) OVER (PARTITION BY department). Партиция ограничивает среднее отделом, но функция возвращает значение для каждой строки, поэтому зарплата стоит рядом со средней.
- ✗Хвататься за
GROUP BY, что сворачивает строки сотрудников - ✗Возвращать одну строку на отдел вместо строки на сотрудника
- ✗Пропускать
PARTITION BY, получая общее среднее вместо среднего по отделу
- →Как заодно отметить сотрудников с зарплатой выше средней по отделу?
- →Что вычисляет здесь
OVER ()без партиции?
Оконный агрегат считает среднее по отделу, но, в отличие от GROUP BY, сохраняет каждую строку сотрудника:
SELECT employee_id,
department,
salary,
AVG(salary) OVER (PARTITION BY department) AS dept_avg
FROM employees;
PARTITION BY department задаёт окно для каждого отдела, а функция возвращает значение для каждой строки. GROUP BY department здесь неверен — он свернул бы всех сотрудников отдела в одну строку. Пустое окно OVER () дало бы одно общее среднее по всей таблице, а не по отделу.