SQl Live: отображение минимального значения столбца, плюс соответствующее значение в той же таблице, а также связанное значение во второй таблице - PullRequest
0 голосов
/ 08 октября 2018

У меня есть две таблицы, DEPT и EMP.EMP имеет столбец deptno, который соответствует столбцу deptno в DEPT.Мне нужно отобразить самое раннее (мин.) Hiredate (еще один столбец в EMP) каждого отдела в DEPT, dname (название отдела) и имя сотрудника (ename)

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

SELECT dname, MIN(hiredate) AS "Most Senior"

FROM dept, emp  
WHERE dept.deptno = emp.deptno  
GROUP BY dname

Редактировать вот таблицы:

CREATE TABLE dept(   
  deptno     number(2,0),   
  dname      varchar2(14),   
  loc        varchar2(13),   
  CONSTRAINT pk_dept PRIMARY KEY (deptno)   
);

CREATE TABLE emp(

  empno    number(4,0),   
  ename    varchar2(10),   
  job      varchar2(9),   
  mgr      number(4,0),   
  hiredate date,   
  sal      number(7,2),   
  comm     number(7,2),   
  deptno   number(2,0),   
  CONSTRAINT pk_emp PRIMARY KEY (empno),   
  CONSTRAINT fk_deptno FOREIGN KEY (deptno) REFERENCES dept (deptno)   
);

Ответы [ 4 ]

0 голосов
/ 08 октября 2018

Чтобы выбрать не только min (hire_date), но и ассоциированного сотрудника, вам нужно будет использовать какой-либо метод ранжирования сотрудников по их hire_date в отделе.Самый простой способ сделать это - использовать функцию row_number.Используя ваш пример кода:

select dept.dname , emp.hiredate as "most_senior" , emp.ename as "senior_employee" from dept join (select * , row_number(PARTITION BY deptno ORDER BY hiredate) as rn from emp ) emp on dept.deptno = emp.deptno and emp.rn = 1 ;

0 голосов
/ 08 октября 2018

Вы можете использовать row_number(), если ваша СУБД поддерживает это.

SELECT x.hiredate,
       x.dname,
       x.ename
       FROM (SELECT e.hiredate,
                    d.dname,
                    e.ename,
                    row_number() OVER (PARTITION BY d.deptno
                                       ORDER BY e.hiredate) rn
                    FROM dept d
                         INNER JOIN emp e
                                    ON e.deptno = d.deptno) x
       WHERE x.rn = 1;

Я также рекомендую использовать явный синтаксис JOIN.

0 голосов
/ 08 октября 2018

Вы можете использовать коррелированный подзапрос:

select d.dname, d.*
from dept d join
     emp e
     on d.deptno = e.deptno
where e.hiredate = (select min(e2.hiredate) from emp e2 where e2.deptno = e.deptno);

Вы также можете решить эту проблему, используя row_number() или rank().Во многих базах данных коррелированный подзапрос часто имеет лучшую производительность, особенно с индексом e(deptno, hiredate).

0 голосов
/ 08 октября 2018

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

SELECT 
  dname,
  e.ename,
  min(e.hiredate) as hire_date 
FROM 
  dept as d, emp e 
where 
  d.deptno = e.deptno 
group by 
  d.deptno
having
  e.hiredate = hire_date
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...