이런데이터가있습니다.
표1.(항목별 이력조회)
순번 |
적용아이템 |
변경전값 |
변경후값 |
적용시작일 |
적용확정일 |
560 |
insrd_cd |
|
2222222 |
20130903 |
20130820 |
560 |
insrd_nm |
|
노태자 |
20130903 |
20130820 |
560 |
insrd_rlatn |
|
02 |
20130903 |
20130820 |
560 |
join_yn |
|
1 |
20130903 |
20130820 |
561 |
insrd_cd |
2222222 |
2222223 |
20130903 |
20130820 |
563 |
insrd_nm |
노태자 |
노태순 |
20130903 |
20130820 |
568 |
insrd_cd |
2222223 |
2222224 |
20130930 |
20130821 |
568 |
insrd_nm |
노태순 |
남태순 |
20130930 |
20130821 |
567 |
insrd_cd |
2222223 |
|
20131115 |
20130821 |
567 |
insrd_nm |
노태순 |
|
20131115 |
20130821 |
567 |
insrd_rlatn |
02 |
|
20131115 |
20130821 |
567 |
join_yn |
1 |
|
20131115 |
20130821 |
이름 |
고객ID |
코드 |
적용기간 |
적용확정일 |
노태순 |
2222223 |
02 |
20130903 ~ 20130930 |
20130820 |
남태순 |
2222224 |
02 |
20130930 ~ 20131115 |
20130821 |
표1의 값을가지고 표2의 값을 도출하는 해야합니다~
~필드설명을 드리자면..
* 순번 : 아이템이 변경될때마다..순서대로 증강하는값
* 적용아이템 : 변경할 아이템항목 insrd_cd(고객ID), insrd_nm(이름), insrd_rlatn(코드), join_yn(가입여부)
* 변경전 값 : 변경하기전에 최종값
* 변경후 값 : 변경된후의 값
* 적용기준일 : 적용아이템이 변경전값->변경후값으로 적용되는 일자
* 적용확정일 : 적용아이템의 값을 변경하는 일자
~적용시작일기준으로
insrd_cd 나 join_yn 가 변경될때마다...변경된이력을 만들고자합니다.
insrd_nm 나 insrd_rlatn 는 변경될때 이력으로 생기진 않지만..
insrd_cd 나 join_yn 가 변경되서 이력으로 만들어될때 순번 기준으로 최신정보로 보여줘야합니다.
그리고 같은적용기간에 insrd_cd 나 join_yn 는 이력으로 중복되지 않아야하고 최종으로 가져와야합니다.(같은 적용기간에 두번이상 중복된 이력은 안됩니다)
그리고 같은 적용시작일에 join_yn 가 짝수이면... 미가입된것이므로(예:가입->미가입, 가입->미가입->가입->미가입) 해당적용일자건들은 이력에 안남아야하겠죠....그치만..그해당일자는 적용종료일이 될것입니다...
참고로 ~ 변경전값이 없고 변경후값이 있는건 가입, 변경전값이 있고 변경후값이 없는건 미가입 한다는 의미입니다.
그리고 위에 표1의 join_yn =1 이면 가입이고, 값이 없으면 미가입이되는겁니다.
가입/미가입시 insrd_cd, insrd_nm, insrd_rlatn, join_yn가 다같이 한꺼번에 변경됩니다.
~
표1 의 적용시작일은 꼭현재가아니더라도 과거 미래 왔다갔다 적용되어서 들어갈수있습니다.
(유동적으로 들어갈껏을 대비하여 짜주시면..감사하겠습니다..)
자바로직으로 구현하려다가 도저히 머리가아파서...sql로 짤수있는방법이있는지 여쭙니다.ㅠ.. 안되면 자바로직으로 라도 메일로 부탁드립니다~(메일주소:kyuul@naver.com)
-- 데이터를 추적해 나가야 하는 경우에 어렵다는 거구요. -- 한사람을 구별해낼 유일키가 존재한다면 어렵지 않을 듯 하네요. WITH t AS ( SELECT 0 seq, 0 id, '' item, '' v1, '' v2, '' sdt, '' rdt FROM dual WHERE 1=2 UNION ALL SELECT 560, 1, 'insrd_cd', '', '2222222', '20130903', '20130820' FROM dual UNION ALL SELECT 560, 1, 'insrd_nm', '', '노태자', '20130903', '20130820' FROM dual UNION ALL SELECT 560, 1, 'insrd_rlatn', '', '02', '20130903', '20130820' FROM dual UNION ALL SELECT 560, 1, 'join_yn' , '', '1', '20130903', '20130820' FROM dual UNION ALL SELECT 561, 1, 'insrd_cd', '2222222', '2222223', '20130903', '20130820' FROM dual UNION ALL SELECT 563, 1, 'insrd_nm', '노태자', '노태순', '20130903', '20130820' FROM dual UNION ALL SELECT 568, 1, 'insrd_cd', '2222223', '2222224', '20130930', '20130821' FROM dual UNION ALL SELECT 568, 1, 'insrd_nm', '노태순', '남태순', '20130930', '20130821' FROM dual UNION ALL SELECT 567, 1, 'insrd_cd', '2222223', '', '20131115', '20130821' FROM dual UNION ALL SELECT 567, 1, 'insrd_nm', '노태순', '', '20131115', '20130821' FROM dual UNION ALL SELECT 567, 1, 'insrd_rlatn', '02', '', '20131115', '20130821' FROM dual UNION ALL SELECT 567, 1, 'join_yn' , '1', '', '20131115', '20130821' FROM dual ) SELECT MIN(insrd_cd ) KEEP(DENSE_RANK LAST ORDER BY seq) insrd_cd , MIN(insrd_nm ) KEEP(DENSE_RANK LAST ORDER BY seq) insrd_nm , MIN(insrd_rlatn) KEEP(DENSE_RANK LAST ORDER BY seq) insrd_rlatn , sdt , MAX(edt) edt , MAX(rdt) rdt FROM (SELECT seq , LAST_VALUE(MIN(DECODE(item, 'insrd_cd', v2)) IGNORE NULLS) OVER(ORDER BY sdt, seq) insrd_cd , LAST_VALUE(MIN(DECODE(item, 'insrd_nm', v2)) IGNORE NULLS) OVER(ORDER BY sdt, seq) insrd_nm , LAST_VALUE(MIN(DECODE(item, 'insrd_rlatn', v2)) IGNORE NULLS) OVER(ORDER BY sdt, seq) insrd_rlatn , MAX(DECODE(item, 'join_yn', v1, '0')) join_yn , sdt , LEAD(sdt) OVER(ORDER BY sdt, seq) edt , rdt FROM t WHERE id = 1 GROUP BY seq, sdt, rdt ) WHERE join_yn = '0' GROUP BY sdt ORDER BY sdt ;