Назад к вопросам
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 в группе.
Оглавление