SQL: соединение по датам и максимум зарплаты через RANK

Первый запрос соединяет строку t1 со всеми более ранними датами t2. Запрос с 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 оставил бы одну.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее