4

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

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

所以请给我提示什么是正确的形式?

4

5 回答 5

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

于 2011-11-24T21:40:59.667 回答
4

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

order by 和 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
于 2011-11-24T22:49:41.923 回答
3
select * from employee 
where 
not exists 
(select 1 from employee e2 where e2.hire_date < employee.hire_date)
于 2011-11-24T21:40:29.890 回答
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;
于 2011-11-24T23:03:54.773 回答
0

这也将起作用:如果您想在不使用联接的情况下显示数据以及员工姓名和雇用日期

select emp_name as ELDER_EMPLOYEE,hire_date 
from employees 
where hire_date=(select min(hire_date) from employees)
于 2017-07-16T08:47:05.560 回答