2017-11-15 9 views
0

히스토리 테이블에서 특정 시점 정보를 추출하려고합니다. 테이블에는 작업 코드, 직원 상태, 작업 위치 등과 같은 속성에 매핑되는 fld_nbr이 들어 있습니다. 특정 날짜의 직원 상태를 어떻게 알 수 있습니까? 데이터는DB2 테이블에서 트랜잭션 테이블의 SQL 시점 지정

Employee# fld_nbr beg_date value 
1234  19  10/1/16 AA 
1234  14  10/1/16 40 
1234  14  1/6/17 46 
1234  19  9/15/17 LA 

가 나는 상태 (fld_nbr 19)과 위치 (fld_nbr 14) 1/1/17에 무엇인지 찾아야 표시 할 수 있습니다. 나는 fld_nbr로 설정 내 결과를 기대 (19) = AA 및 fld_nbr 여기에 편집 내가 함께 결국 무엇을 (14) = 40

: 당신에게 줄 것이다,

WITH MO1 AS 
(SELECT AFF.AFFILIATE, COUNT(HIS.EMPLOYEE) AS MO1_HC 
FROM 
(SELECT HIST.COMPANY, HIST.EMPLOYEE, EMP.ANNIVERS_DATE, EMP.TERM_DATE, 
MAX(CASE WHEN HIST.FLD_NBR = 14 THEN A_VALUE END) AS PROCESS_LEVEL, 
MAX(CASE WHEN HIST.FLD_NBR = 14 THEN BEG_DATE END) AS PL_DATE, 
MAX(CASE WHEN HIST.FLD_NBR = 15 THEN A_VALUE END) AS DEPARTMENT, 
MAX(CASE WHEN HIST.FLD_NBR = 15 THEN BEG_DATE END) AS DEPT_DATE, 
MAX(CASE WHEN HIST.FLD_NBR = 20 THEN A_VALUE END) AS EMP_STATUS, 
MAX(CASE WHEN HIST.FLD_NBR = 20 THEN BEG_DATE END) AS STATUS_DATE, 
DAYS(DATE('2017-10-31')) - DAYS(EMP.ANNIVERS_DATE) AS DOS 
FROM DATAMGMT.VW_GCHRHRHISTORY HIST 
INNER JOIN (SELECT EMPLOYEE, FLD_NBR, MAX(BEG_DATE) AS MostRecent 
        FROM DATAMGMT.VW_GCHRHRHISTORY 
        WHERE BEG_DATE < DATE('2017-10-31') 
        AND COMPANY = 207 
        AND FLD_NBR IN (14, 15, 20) 
        GROUP BY EMPLOYEE, FLD_NBR) AS tA ON HIST.EMPLOYEE = tA.EMPLOYEE 
                  AND HIST.FLD_NBR = tA.FLD_NBR 
                  AND HIST.BEG_DATE = tA.MostRecent 
INNER JOIN DATAMGMT.VW_GCHREMPLOYEE EMP ON HIST.EMPLOYEE = EMP.EMPLOYEE 
WHERE EMP.ANNIVERS_DATE BETWEEN DATE('2017-10-31') - 365 DAYS AND DATE('2017-10-31') 
AND SUBSTR(HIST.A_VALUE, 1, 1) NOT IN ('T', 'Z') 
GROUP BY HIST.COMPANY, HIST.EMPLOYEE, EMP.ANNIVERS_DATE, EMP.TERM_DATE) AS HIS 
INNER JOIN DATAMGMT.VW_GCHRAFFILIATE AFF ON AFF.COMPANY = HIS.COMPANY AND AFF.PROCESS_LEVEL = HIS.PROCESS_LEVEL AND AFF.DEPARTMENT = HIS.DEPARTMENT 
WHERE HIS.EMP_STATUS IS NOT NULL 
GROUP BY AFF.AFFILIATE), 
MO2 AS 
(SELECT AFF.AFFILIATE, COUNT(HIS.EMPLOYEE) AS MO2_HC 
FROM 
(SELECT HIST.COMPANY, HIST.EMPLOYEE, EMP.ANNIVERS_DATE, EMP.TERM_DATE, 
MAX(CASE WHEN HIST.FLD_NBR = 14 THEN A_VALUE END) AS PROCESS_LEVEL, 
MAX(CASE WHEN HIST.FLD_NBR = 14 THEN BEG_DATE END) AS PL_DATE, 
MAX(CASE WHEN HIST.FLD_NBR = 15 THEN A_VALUE END) AS DEPARTMENT, 
MAX(CASE WHEN HIST.FLD_NBR = 15 THEN BEG_DATE END) AS DEPT_DATE, 
MAX(CASE WHEN HIST.FLD_NBR = 20 THEN A_VALUE END) AS EMP_STATUS, 
MAX(CASE WHEN HIST.FLD_NBR = 20 THEN BEG_DATE END) AS STATUS_DATE, 
DAYS(DATE('2017-10-31') - 1 MONTH) - DAYS(EMP.ANNIVERS_DATE) AS DOS 
FROM DATAMGMT.VW_GCHRHRHISTORY HIST 
INNER JOIN (SELECT EMPLOYEE, FLD_NBR, MAX(BEG_DATE) AS MostRecent 
        FROM DATAMGMT.VW_GCHRHRHISTORY 
        WHERE BEG_DATE < DATE('2017-10-31') - 1 MONTH 
        AND COMPANY = 207 
        AND FLD_NBR IN (14, 15, 20) 
        GROUP BY EMPLOYEE, FLD_NBR) AS tA ON HIST.EMPLOYEE = tA.EMPLOYEE 
                  AND HIST.FLD_NBR = tA.FLD_NBR 
                  AND HIST.BEG_DATE = tA.MostRecent 
INNER JOIN DATAMGMT.VW_GCHREMPLOYEE EMP ON HIST.EMPLOYEE = EMP.EMPLOYEE 
WHERE EMP.ANNIVERS_DATE BETWEEN DATE('2017-10-31') - 1 MONTH - 365 DAYS AND DATE('2017-10-31') - 1 MONTH 
AND SUBSTR(HIST.A_VALUE, 1, 1) NOT IN ('T', 'Z') 
GROUP BY HIST.COMPANY, HIST.EMPLOYEE, EMP.ANNIVERS_DATE, EMP.TERM_DATE) AS HIS 
INNER JOIN DATAMGMT.VW_GCHRAFFILIATE AFF ON AFF.COMPANY = HIS.COMPANY AND AFF.PROCESS_LEVEL = HIS.PROCESS_LEVEL AND AFF.DEPARTMENT = HIS.DEPARTMENT 
WHERE HIS.EMP_STATUS IS NOT NULL 
GROUP BY AFF.AFFILIATE) 
SELECT MO1.AFFILIATE, MO1.MO1_HC, MO2.MO2_HC 
FROM MO1 
INNER JOIN MO2 ON MO2.AFFILIATE = MO1.AFFILIATE 
+0

날짜 범위와 우수한 블로그 재미가 될 수 있도록 TSQL을 사용하여 작성되었다 - 또한 Used_By_Already의 답에 맞는 - 여기 http://www.idug.org/p/bl/et/blogaid=672 – MichaelTiefenbacher

+0

모두에게 도움을 주셔서 감사합니다! 나는 실제로 모든 샘플을 사용하고 있으며 매우 감사하고 있습니다! 내가 끝낸 것을 보여주기 위해 원래 게시물을 편집했습니다. –

답변

0

당신이 뭔가를 시도 할 수 각 직원/fld_nbr 조합에 대한 시간 레코드 점 (내가 DB2 날짜 리터럴의 구문을 잊고, 그와 함께 플레이해야 할 수도 있습니다) :

SELECT * 
FROM tbl INNER JOIN (SELECT Employee#, fld_nbr, MAX(beg_date) AS MostRecent 
        FROM tbl 
        WHERE beg_date < #1/1/17# 
        GROUP BY Employee#, fld_nbr) AS tA ON tbl.Employee# = tA.Employee# 
                  AND tbl.fld_nbr = tA.fld_nbr 
                  AND tbl.beg_date = tA.MostRecent 
+0

도움을 주셔서 감사합니다. 나는 당신이 도울 수있는 또 다른 걸림돌을 발견했습니다. 동일한 날짜에 발생하는 트랜잭션에 사용되는 SEQ_NBR 필드가 있습니다. 최대 날짜와 SEQ_NBR을 가져와야합니다. 어떤 아이디어? –

+0

나는 새로운 질문을 전체적으로 요청할 것이다 ... –

+0

고마워, 나는 그랬다! –

0

내가 LEAD()는 다음이된다하여 날짜 범위를 반영하기 위해 데이터를 마사지 제안 단일 값에 적용되는 값을 분리하기 쉽다. 날짜.

select 
* 
from (
    select 
     employee 
     , fld_nbr 
     , beg_date 
     , coalesce(lead(beg_date,1) over(partition by Employee, fld_nbr order by beg_date), current date) end_date 
    from table1 
    ) d 
where beg_date <= date('2017-01-01') 
and end_date > date('2017-01-01') 

| employee | fld_nbr |    beg_date |    end_date | 
|----------|---------|----------------------|----------------------| 
|  1234 |  14 | 2016-10-01T00:00:00Z | 2017-01-06T00:00:00Z | 
|  1234 |  19 | 2016-10-01T00:00:00Z | 2017-09-15T00:00:00Z | 

주의 : 내 예는 내 DB2 구문이 조금 떨어져

Demo