Нахождение второй по величине зарплаты по подзапросам - PullRequest
2 голосов
/ 17 марта 2019

У меня две таблицы сотрудников и отделов.

Таблица сотрудников имеет имя, зарплату, департамент_ид. Таблица отделов имеет идентификатор отдела, имя отдела

Мне нужно отобразить сотрудника со вторым по величине (буквально единственным сотрудником, который имеет второй по величине оклад среди каждого сотрудника в таблице сотрудников) и его имя_подразделения с использованием подзапросов

select 
    max(e.salary),
    d.department_name 
from oehr_employees e 
join oehr_departments d on(e.department_id = d.department_id) 
where e.salary not in(
    select max(salary) from oehr_employees
) 
group by department_name

попытался сделать это, но он показывает только вторую самую высокую зарплату в каждом департаменте. Понятия не имею, что делать: /

Пробовал искать ответы, но не совсем получил то, что хотел.

Ответы [ 4 ]

0 голосов
/ 17 марта 2019

Я бы просто немного изменил ваш запрос и добавил limit 1:

select e.*, d.department_name
from oehr_employees e join
     oehr_departments d
     on e.department_id = d.department_id)
where e.salary < (select max(e2.salary) from oehr_employees e2) 
order by e.salary desc
limit 1;

Кажется, это соответствует загадочному требованию использования подзапросов.И это разумный подход.

0 голосов
/ 17 марта 2019

Если вы хотите сделать это с помощью подзапросов, вы можете попробовать выполнить следующие действия, чтобы получить сведения о сотруднике (ах) и отделе (ах) со второй по величине зарплатой.

select e.name,e.salary,d.department_id,d.department_name
 from 
 oehr_employees e
 join oehr_departments d on e.department_id = d.department_id
 WHERE  e.salary IN (SELECT Max(salary) 
                  FROM   oehr_employees 
                  WHERE  salary NOT IN (SELECT Max(salary) 
                                        FROM   oehr_employees)); 
0 голосов
/ 17 марта 2019

Использовать ROW_NUMBER ():

SELECT * 
FROM (
    SELECT 
        e.employee_id,
        d.department_id,
        e.salary,
        ROW_NUMBER() OVER(ORDER BY e.salary DESC) rn
    FROM oehr_employees e 
    INNER JOIN oehr_departments d 
        ON e.department_id = d.department_id
) x WHERE rn = 2
0 голосов
/ 17 марта 2019

Если вам просто нужна вторая более высокая зарплата, вы можете использовать лимит и смещение.

Не будет ли это правильным решением?

select e.salary,d.department_name 
from oehr_employees e 
join oehr_departments d on(e.department_id = d.department_id)
ORDER BY e.salary DESC LIMIT 1 OFFSET 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...