我有一个员工表,其中的字段为:
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
那么请告诉我什么是正确的形式?
答案 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)