查询目的:员工在DB中列出了多个职位。但是,查询应仅返回每个职位级别具有最新effect_date的职位。
例如:
Employee Position Position_Level Effect_Date Process_Level
_____________________________________________________________
1 , POS1 , 1 , 01/01/2000 ,ABC
1 , POS1 , 1 , 01/01/2002 , ABC
1 , POS1 , 1 , 01/01/2003 , ABC
1 , ABCD , 1 , 01/01/2004 , ABC
1 , POS1 , 1 , 01/01/2005 , ABC
1 , POS2 , 2 , 01/01/2000 , DEF
1 , POS2 , 2 , 01/01/2002 , DEF
1 , IRHT , 2 , 01/01/2003 , DEF
1 , POS2 , 2 , 01/01/2004 , DEF
查询应返回:
Employee Position Position_Level Effect_Date Process_Level
1 , POS1 , 1 , 01/01/2005 , ABC
1 , POS2 , 2 , 01/01/2004 , DEF
这可以在一个查询中实现吗?由于我只需要记录到Position_Level = 3,我也可以进行3次单独查询,但是我无法为每个位置级别获取1条不同的记录。
我有这个查询,我用它作为起点,但显然没有得到我需要的结果。有什么建议吗?
select A.*, B.pos_level,B.employee from (select position,max(effect_date)EFFECT_DATE
from paemppos
group by position) A
JOIN paemppos B
on A.POSITION=B.POSITION
答案 0 :(得分:2)
一般来说,最有效的方法是not exists
使用适当的索引:
select p.*
from paemppos p
where not exists (select 1
from paemppos p2
where p2.employee = p.employee and
p2.position = p.position and
p2.effect_date > p.effect_date
);
最佳指数是paemppos(employee, position, effect_date)
。
此查询说:"从paemppos
获取行中的所有行,其中行中的员工/职位在数据中没有更大的effect_date
。"