具有聚合和不同的SQL查询

时间:2014-03-25 19:07:36

标签: sql max distinct

查询目的:员工在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

1 个答案:

答案 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。"