Найдите зарплату самого молодого и старшего сотрудника в каждом отделе - PullRequest
0 голосов
/ 07 мая 2020

Есть две таблицы

1) Employee
id | Name |  Department | Dob 

2) Salary
id | salary

Я хочу найти зарплату самого молодого и старшего сотрудника в каждом отделе. Но с помощью следующего запроса я не могу получить правильный идентификатор, зарплату.

SELECT salary.id,employee.Dept,salary.salary,MIN(employee.DoB) 
from employee 
INNER JOIN salary ON salary.id = employee.id  GROUP by Dept

Вышеупомянутый запрос возвращает правильный Dob, но идентификаторы и зарплата не соответствуют Дата рождения.

Ответы [ 2 ]

0 голосов
/ 07 мая 2020

Думаю, я бы использовал = дважды с коррелированными подзапросами:

select s.*, e.department
from salary join
     employee e
     on s.id = e.id
where e.dob = (select min(e2.dob) from employee e where e2.department = e.department) or
      e.dob = (select max(e2.dob) from employee e where e2.department = e.department) ;

С индексом на employee(department, dob) я ожидал бы, что это будет иметь очень хорошую производительность.

0 голосов
/ 07 мая 2020

Если вы используете MySQL 8.0, просто используйте оконные функции:

select *
from (
    select 
        e.*, 
        s.salary,
        row_number() over(partition by department order by dob asc) rn_asc,
        row_number() over(partition by department order by dob desc) rn_desc
    from employee e
    inner join salary s on s.id = employee.id
) t
where 1 in (rn_asc, rn_desc)

В более ранних версиях можно было присоединиться к агрегатному запросу:

select e.*, s.salary
from employee e
inner join salary s on s.id = employee.id
inner join (
    select department, min(dob) min_dob, max(dob) max_dob 
    from employee
    group by department
) d on d.department = e.department and e.dob in (d.min_dob, d.max_dob)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...