Первый запрос соединяет строку t1 со всеми более ранними датами t2. Запрос с RANK выбирает всех сотрудников с максимальной зарплатой в своём подразделении.
SQL: соединение по датам и максимум зарплаты через RANK
Первый запрос соединяет строку t1 со всеми более ранними датами t2. Запрос с RANK выбирает всех сотрудников с максимальной зарплатой в своём подразделении.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
SELECT * FROM table1 AS t1 LEFT JOIN table2 AS t2 ON t1.date_start > t2.date_start
--DML CREATE TABLE IF NOT EXISTS Employee (id int, salary int, departmentId int); INSERT INTO Employee (id,salary,departmentId) VALUES (1, 70000, 1),(2, 94000, 1),(3, 85000, 1),(4, 80000, 2),(5, 60000, 2),(6, 62000, 3),(7, 90000, 3),(8, 94000, 3),(9, 94000, 3);
with cte as( select *, rank() over(partition by departmentId order by salary desc) as max_salary from Employee ) select * from cte where max_salary = 1","targetLocales":["ru","kk"]},{
Ответ
Первый запрос соединяет строку t1 со всеми более ранними датами t2. Запрос с RANK выбирает всех сотрудников с максимальной зарплатой в своём подразделении.
LEFT JOIN по неравенству может вернуть несколько строк на одну строку t1; при отсутствии подходящих t2 правая часть заполнится NULL. Без данных этих таблиц точное число строк неизвестно.
Во втором фрагменте нужно убрать посторонний хвост после max_salary = 1:
WITH ranked AS (
SELECT id, salary, departmentId,
RANK() OVER (
PARTITION BY departmentId ORDER BY salary DESC
) AS salary_rank
FROM Employee
)
SELECT id, salary, departmentId
FROM ranked
WHERE salary_rank = 1
ORDER BY departmentId, id;
Для данных условия результат: (2, 94000, 1), (4, 80000, 2), (8, 94000, 3), (9, 94000, 3). Равные максимальные зарплаты сохраняются обе; ROW_NUMBER оставил бы одну.