2014-03-25 4 views
1

쿼리 용도 : 직원은 각각 DB에 나열된 여러 위치에 있습니다. 그러나 쿼리는 각 위치 수준에 대해 가장 최근의 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

는이 작업을 수행하는 가장 효율적인 방법은 appoprirate 지수 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)에 있습니다.

이 쿼리의 내용은 다음과 같습니다. "행의 직원/위치가 데이터에 더 큰 effect_datepaemppos에서 모든 행을 가져옵니다."

+0

직원 ID가있는 where 조건을 추가해야한다고 생각합니다. –

+0

@LajosVeres. . . 그래 네가 맞아. –

+0

@GordonLinoff 답변 해 주셔서 감사합니다. 나는 당신이 제안한 것을 시도했고 그것은 내가 필요로하는 결과물을주는 것으로 보인다. 감사! – user1949354