2016-10-27 1 views
2

월별로 고용 상태를 파악하는 테이블이 있다고 가정 해 보겠습니다. 직원이 인턴으로 시작하여 학교에 다시 돌아가 전임으로 돌아온 시나리오가 있습니다.주간 스냅 샷으로 고용 기록 찾기

이상적으로 말하면, 나는 그/그녀의 고용 기록의 역사가 거의 완벽하다. 내가

SELECT 
    date_hire, 
    date_termination, 
    employee_id, 
    employee_type 
FROM 
    employees 
GROUP BY 
    date_hire, 
    date_termination, 
    employee_id, 
    employee_type 

이 날을 반환 기술로 사용하여이 그룹을하고 시도

date_snapshot date_hire date_termination employee_id employee_type 
2012_01_01  2012_01_01 null    10002   intern 
2012_02_01  2012_01_01 null    10002   intern 
2012_03_01  2012_01_01 2012_03_01   10002   intern 
2012_04_01  2012_01_01 2012_03_01   10002   intern 
2012_05_01  2012_05_01 null    10002   full-time 
2012_06_01  2012_05_01 null    10002   full-time 
2012_07_01  2012_05_01 null    10002   full-time 
...... 

처럼

date_hire date_termination employee_id employee_type 
2012_01_01 2012_03_01   10002   intern 
2012_05_01 null    10002   full-time 

데이터는 내가 한 원치 않는 기록

date_hire date_termination employee_id employee_type 
2012_01_01 null    10002   intern 
2012_01_01 2012_03_01   10002   intern 
2012_05_01 null    10002   full-time 
+0

호환되지 않는 데이터베이스 태그를 제거했습니다. 실제로 사용중인 데이터베이스의 태그를 다시 추가하십시오. –

답변

0

하는 경우가 있습니다 보인다 우리는 emp loyee는 이전 유형으로 되돌릴 수 없습니다 (예 : -

select date_hire 
     ,date_termination 
     ,employee_id 
     ,employee_type 

from  (select e.* 
        ,lead (date_hire)  over (partition by e.employee_id order by date_snapshot) as next_date_hire 
        ,lead (date_termination) over (partition by e.employee_id order by date_snapshot) as next_date_termination 
        ,lead (employee_type) over (partition by e.employee_id order by date_snapshot) as next_employee_type 
        ,max (date_snapshot) over (partition by e.employee_id)      as max_date_snapshot 

      from  employees e 
     ) 

where  date_hire   <> next_date_hire 
     or date_termination <> next_date_termination 
     or employee_type  <> next_employee_type 
     or date_snapshot  = max_date_snapshot 
; 
0

아래 쿼리는 원하는 출력을 제공한다

select  date_hire 
      ,min (date_termination) as date_termination 
      ,employee_id 
      ,employee_type 

from  employees e 

group by date_hire 
      ,employee_id 
      ,employee_type 
; 

그렇지 않으면 : 인턴 -> AWF - -> 전임> AWF는) 다음 간단한 해결책이있다.

SELECT DISTINCT MIN(date_hire) OVER (PARTITION BY employee_id,employee_type) date_hire, 
     MIN(date_termination) OVER (PARTITION BY employee_id,employee_type) date_termination, 
     employee_type,employee_id 
FROM employees; 
관련 문제