날짜구간 (발령시작일 ~ 발령종료일) update 구문 좀 도와주세요.. 0 4 1,414

by sun [SQL Query] [2014.06.12 16:33:26]


안녕하세요.. 실력 정말없는 1인입니다.

이곳에서 자료를 찾아서 적용해봐도 도저히 안되서 도움 좀 청하고자 합니다.

현재 아래와 같은 식의 data가 들어있는데.. 담당자가 발령종료일을 계속해서 입력을 안한 상태입니다.

사번 발령일 발령시작일 발령종료일
15327 19870629 19870629  
15327 19940101 19940101  
22552 19871112 19871112  
22553 19940101 19940101  
22553 19960102 19960102  
92741 19871015 19871015  
92741 19940101 19940101  

이를 update 하고자 하는데.. update하고자 하는 data의 모습은 아래와 같습니다.

사번 발령일 발령시작일 발령종료일
15327 19870629 19870629 19931231
15327 19940101 19940101  
22552 19871112 19871112 19931231
22553 19940101 19940101 19960101
22553 19960102 19960102  
92741 19871015 19871015 19931231
92741 19940101 19940101  

발령종료일 컬럼을 update해야 되며 붉은색 Data로  업데이트를 해야합니다. 즉 마지막 발령시작일 바로 전날로 업데이트 해야 하며 빈칸은 발령시작일로부토 현재까지 동일 발령으로 계속 이어진다는 의미입니다. 2999/12/31로 해도 되구요..

이작업을 하려고 하는데.. 쿼리 좀 부탁드립니다.

by 약쟁이총각 [2014.06.12 17:05:57]

의문1.

22552번 데이터가 들어간것을 봐서는 기준날과 그다음에 나오는 날을 비교해서 비교날이 더 크면 비교날 -1..

이건가요?? (사번은 정렬을 위한것 같네요..)


by sun [2014.06.13 10:02:36]

네 맞습니다.

답변 감사드립니다.

실력이 안돼서 헤매고 있었네요..


by 비주류 [2014.06.12 21:56:56]
MERGE INTO 테이블 a
USING (
    SELECT * FROM (
        SELECT TO_CHAR(TO_DATE(LEAD(발령일) OVER (PARTITION BY 사번 ORDER BY 발령일), 'YYYYMMDD') - 1, 'YYYYMMDD') 발령종료일
        FROM 테이블
    )
    WHERE 발령종료일 IS NOT NULL
) b
ON (a.ROWID = b.ROWID)
WHEN MATCHED THEN UPDATE SET a.발령종료일 = b.발령종료일

-- PK 가 있다면 ROWID 조건 대체하거나 추가해주세요.

https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:53140678334596


by sun [2014.06.13 10:03:22]

답변 감사합니다.

이렇게 하는 방법이 있었군요..

LEAD 함수 공부 좀 해야겟네요..

정말 감사드립니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입