2014-03-25 25 views
1

查詢的目的:員工有幾個職位,每個職位都在數據庫中列出。但是,查詢應僅返回每個職位級別具有最新effect_date的職位。具有聚合和不同的Sql查詢

例如:

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 

回答

2

一般情況下,最有效的方式做到這一點是not exists與appoprirate指數:

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。」

+0

我認爲你應該在僱員ID中添加一個where條件。 –

+0

@LajosVeres。 。 。你是對的。 –

+0

@GordonLinoff感謝您的回覆。我嘗試了你的建議,它似乎給了我需要的輸出。謝謝! – user1949354