我有以下代码,可以找到每个部门中大多数早期雇用的员工
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
请帮我解释这段代码有什么问题?
答案 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
的员工。如果您使用rank
或dense_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