找到每个部门中最早雇用的员工

时间:2011-12-01 15:44:28

标签: sql oracle

我有以下代码,可以找到每个部门中大多数早期雇用的员工

select  d.department_name,e.first_name || ' '||  e.last_name,e.hire_date,min(e.hire_date)
      from employees e join departments d
      on e.department_id=d.department_id
   group by d.department_name,e.hire_date

但它显示我跟随错误

ORA-00979: not a GROUP BY expression
00979. 00000 -  "not a GROUP BY expression"
*Cause:    
*Action:
Error at Line: 13 Column: 26

请帮我解释这段代码有什么问题?

5 个答案:

答案 0 :(得分:2)

您在分组查询中包含非聚合的非分组字段。

此外,您按hire_date和department进行分组,因此您的查询将为每个部门中的每个不同的hire_date返回一行,而不是每个部门只返回一行(尽管这不会阻止您的查询运行,但它会阻止它返回所需的结果。)

考虑查看子查询或分析函数以返回所需的数据。

答案 1 :(得分:1)

这样的查询无法正常工作。 为什么您按这些列进行分组?你想通过这样做实现什么目标?你怎么能用文字来描述这个问题呢?

在进行查询之前,请用英文写一下:

  

最早雇用的员工是每个部门拥有最低(最早)hire_date的员工。

我不打算给你查询,因为我觉得这是一个功课,但你应该可以从这里下来。

答案 2 :(得分:1)

最简单的方法通常是在此处使用分析函数。但是,如果有关系,就会出现皱纹。如果同一个部门有两个人在同一天被雇用,这不是非常不可能的,你想要退还他们吗?或者你想指定一个次要标准来打破平局?或者你只是想让Oracle随机打破平局?而且,如果你不是在寻找前排,而是排在前3位或前5位,你如何处理领带之后的行。

此查询

select department_name,
       employee_name,
       hire_date
  from (
    select d.department_name,
           e.first_name || ' '||  e.last_name employee_name,
           e.hire_date,
           row_number() over (partition by d.department_name order by e.hire_date asc) rnk
      from employees e join departments d
        on e.department_id=d.department_id
  )
 where rnk = 1
如果在同一天雇佣了两名员工,

将通过随机断开关系来返回每个部门中最早hire_date的员工。如果您使用rankdense_rank函数而不是row_number,则会返回两行。如果您在分析函数中为订单添加了其他条件,则可以确定如何打破平局(例如,通过对员工的姓氏进行排序)。

答案 3 :(得分:1)

一旦您获得每个部门的最早雇用日期,您就可以对员工表进行内部联接,以查看您从该部门雇用该日期的人员。

修改: 这样的事情应该有效。

select 
    a.department_name,
    a.EarliestHireDate,
    b.first_name + ' ' + b.last_name AS EmployeeName
from
    (
      select min(e.hire_date) as  EarliestHireDate, d.department_name, d.department_id
      from employees e join departments d
        on e.department_id=d.department_id
      group by d.department_name
    ) as a
    inner join employees as b
        on a.EarliestHireDate = b.hire_date
            and a.department_id = b.department_id

如果在该部门雇用了最早的雇佣日,则每个部门将获得1名以上的员工

答案 4 :(得分:0)

select  d.department_name,e.first_name || ' '||  e.last_name,min(e.hire_date) 
      from employees e join departments d
      on e.department_id=d.department_id
   group by d.department_name,e.first_name || ' '||  e.last_name