MiddleКодЧастоЕщё не отвечали
Запрос самого высокооплачиваемого в каждом отделе
Верните самого высокооплачиваемого сотрудника в каждом отделе.
-- Employee(id, name, salary, dept_id, manager_id)
-- напишите ваш запрос здесь
Напишите запрос.
Проранжируйте внутри каждого отдела и оставьте ранг 1: SELECT * FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY dept_id ORDER BY salary DESC) AS rn FROM Employee) t WHERE rn = 1. PARTITION BY dept_id перезапускает ранжирование на каждый отдел — каноничный паттерн top-N в группе.
- ✗Выбирать неагрегированное
nameрядом сMAX(salary)вGROUP BY - ✗Применять глобальный
LIMITвместо ранга по разделу - ✗Фильтровать по максимуму всей компании, а не по отделу
- →Как вернуть топ-3 по зарплате в каждом отделе вместо только первого?
- →Почему
ROW_NUMBERпо разделу лучше коррелированного подзапроса здесь?
Оглавление
Задача
Верните самого высокооплачиваемого сотрудника в каждом отделе таблицы Employee.
Решение
SELECT id, name, dept_id, salary
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY dept_id ORDER BY salary DESC) AS rn
FROM Employee
) t
WHERE rn = 1;
Ключевые моменты
PARTITION BY dept_idперезапускает нумерацию внутри каждого отдела.ROW_NUMBER ... = 1берёт топового в отделе; для всех при равенстве используйтеRANK/DENSE_RANK.GROUP BY dept_idс неагрегированнымnameнекорректен — это и есть паттерн top-N в группе.
Оглавление