Выберите самого раннего наемного сотрудника из таблицы сотрудников - PullRequest
4 голосов
/ 25 ноября 2011

У меня есть таблица сотрудников, в которой есть следующие поля:

имя_ фамилии, имя_ фамилии, дата найма, зарплата, идентификатор отдела, имя_подразделения и т. Д.

Меня просят найти самых ранних наемных работников,Я знаю такие функции, как max, sysdate и months_between, но я не знаю, как использовать его здесь?

Я думал, что эту проблему можно решить следующим образом:

select e.first_name,max(e.hire_date)
from employees e

но выдает следующую ошибку:

 oRA-00937: not a single-group group function
    00937. 00000 -  "not a single-group group function"
    *Cause:    
    *Action:
    Error at Line: 1 Column: 7

Так что, пожалуйста, дайте мне подсказку, что будет правильной формы?

Ответы [ 5 ]

9 голосов
/ 25 ноября 2011

Чтобы найти самого наемного работника:

 SELECT * FROM
 (
     SELECT * 
     FROM  employees
     ORDER BY hire_date
 )
 WHERE rownum = 1;

Если вам нужны 10 самых ранних наемных работников:

 SELECT * FROM 
 (
   SELECT * 
   FROM  employees
   ORDER BY hire_date
 )
 WHERE rownum <= 10;

Используется псевдостолбец Oracle ROWNUM

4 голосов
/ 25 ноября 2011

Это будет минимум для самого раннего, а не для макс.

Альтернативный маршрут к заказу и решение для rownum

select min(hire_date) as earliest_hire_date from employees

Это получает самую раннюю дату найма.Назовите это подзапросом и присоединитесь к сотрудникам, чтобы получить остальную информацию, которая вам нужна

 select e.*, earliest_hire_date
 from (select min(hire_date) as earliest_hire_date from employees) a
 inner join employees e on e.hire_date = a.earliest_hire_date

Функции внутреннего объединения в качестве фильтра здесь.Преимущество этого метода заключается в том, что если в один и тот же день наняты несколько сотрудников, он вернет несколько строк ... по одной на каждого сотрудника, нанятого в эту дату.

Если вам удобнее без внутреннего объединения, это эквивалентно:

select e.*, earliest_hire_date
from (select min(hire_date) as earliest_hire_date from employees) a, employees
where e.hire_date = a.earliest_hire_date
3 голосов
/ 25 ноября 2011
select * from employee 
where 
not exists 
(select 1 from employee e2 where e2.hire_date < employee.hire_date)
2 голосов
/ 25 ноября 2011

Аналитик также может работать:

SELECT emp_name, hire_date
  FROM (SELECT first_name, hire_date
             , dense_rank() OVER (ORDER BY hire_date) rnk
          FROM employees e)
 WHERE rnk = 1;
0 голосов
/ 16 июля 2017

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

select emp_name as ELDER_EMPLOYEE,hire_date 
from employees 
where hire_date=(select min(hire_date) from employees)
...