从员工表中选择最早雇用的员工

时间:2011-11-24 21:37:16

标签: sql oracle ora-00937

我有一个员工表,其中的字段为:

first_name,last_name,hire_date,salary,department_id,department_name等。

我被要求找到最早雇用的员工。我知道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 个答案:

答案 0 :(得分:9)

找到最早雇用的员工:

 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

答案 1 :(得分:4)

它最早是最小的,而不是最大的。

订购和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

答案 2 :(得分:3)

select * from employee 
where 
not exists 
(select 1 from employee e2 where e2.hire_date < employee.hire_date)

答案 3 :(得分:2)

分析也可以起作用:

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;

答案 4 :(得分:0)

这也有效: 如果要在不使用联接的情况下显示数据以及员工姓名和雇用

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