쿼리~재질문~ 0 2 1,831

by 겨울이불 [2013.08.28 16:43:06]




    WITH t AS
    (
    SELECT 560 seq, 1 id, 'insrd_cd' item, '' v1, '2222222' v2, '20130903' sdt, '20130820' rdt 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 562, 1, 'insrd_rlatn',  '02',  '05'     , '20130905', '20130820' FROM dual
    UNION ALL SELECT 562, 1, 'insrd_cd'   , '2222222', '2222223', '20130905', '20130820' FROM dual
    UNION ALL SELECT 562, 1, 'insrd_nm'   , '노태자', '김태자'  , '20130905', '20130820' FROM dual
    UNION ALL SELECT 561, 1, 'insrd_rlatn',  '02',  '07'     , '20130910', '20130820' 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
, nvl(MAX(edt),'20140903') 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



-> 마농님이 짜주신 위쿼리 내역을 살펴보던중에 조회값을  제가 원하는대로 변경을 하고싶은데.
   
현재조회값은 이렇게 나오는데..

INSRD_CD

INSRD_NM

INSRD_RLATN

SDT

EDT

RDT

2222222

노태자

02

20130903

20130905

20130820

2222223

김태자

05

20130905

20130910

20130820

2222223

김태자

07

20130910

20140903

20130820




실질적으로 9/10일에 적용한건 insrd_rlatn :02 -> 07 뿐이없는데..

9/10일 이력에  9/5일날 소급적용한건 (insrd_rlatn, insrd_cd, insrd_nm) 으로 보여주고있습니다.

나오고자하는결과는~ 10일에는 'insrd_rlatn만 02->07로 바뀌었기때문에 5일에수정한 insrd_nm, insrd_cd는 5일이력에만 보여야 합니다.

그래서 마지막줄은 2222222 노태자 07 ~ 이렇게 나와야 되는게 맞을거같습니다. 

9/10일껏이 SEQ가 앞이고..9/5일이 뒤에 소급적용되어서..이런결과가 나온거같은데...

만약에 반대로  9/5일이..먼저 적용되고 9/10일적용건이 뒷건이면...위결과가 맞는 상황입니다...

방법이없을까요? ㅠ부탁드리겠습니다~

 

by 마농 [2013.08.28 17:54:07]

일자 기준이 아니라 순번 기준이라면?
LAST_VALUE 의 정렬 부분만 살짝 바꿔주면 될 듯.
 - 변경전 : ORDER BY sdt, seq
 - 변경후 : ORDER BY seq
단, LEAD 의 정렬은 그대로 유지해야 할 듯.


by 겨울이불 [2013.08.28 19:00:03]
네..덕분에 감사합니다.
~
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입