Вывести сотрудников с максимальной зарплатой
Таблица employees(first_name, hire_date, salary). Выведите имя каждого сотрудника, чья зарплата равна максимальной в таблице. Возможны совпадения, поэтому верните всех, а не одну строку.
-- напишите SELECT по employees, возвращающий first_name
-- для каждого сотрудника с максимальной зарплатой
Напишите запрос.
Считают максимум зарплаты один раз и выбирают всех, кто ему равен. CTE делает это чисто: WITH m AS (SELECT MAX(salary) s FROM employees) SELECT first_name FROM employees JOIN m ON salary = m.s. Эквивалентно WHERE salary = (SELECT MAX(salary) FROM employees).
- ✗Смешивать MAX() с обычным столбцом без GROUP BY
- ✗Использовать LIMIT 1, теряя сотрудников с равным максимумом
- ✗Путать «выше среднего» с максимумом
- →Как заодно вернуть только нанятых в этом году?
- →Почему LIMIT 1 может дать неверный ответ здесь?
Считают максимум зарплаты один раз, затем выбирают всех, чья зарплата ему равна, — так совпадения (ties) сохраняются.
WITH max_salary AS (
SELECT MAX(salary) AS max_sal FROM employees
)
SELECT e.first_name, e.hire_date
FROM employees e
JOIN max_salary m ON e.salary = m.max_sal;
Эквивалентная форма со скалярным подзапросом:
SELECT first_name, hire_date
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);
ORDER BY salary DESC LIMIT 1 неверен, когда максимум делят несколько сотрудников, — он вернёт только одного. Чтобы дополнительно ограничить нанятыми в этом году, добавьте AND hire_date >= date_trunc('year', current_date).