with base as
(SELECT 1 no, '20141101' dt FROM dual
UNION ALL SELECT 1, '20141102' FROM dual
UNION ALL SELECT 1, '20141103' FROM dual
UNION ALL SELECT 1, '20141105' FROM dual
UNION ALL SELECT 1, '20141106' FROM dual
UNION ALL SELECT 1, '20141109' FROM dual
UNION ALL SELECT 1, '20141120' FROM dual
UNION ALL SELECT 2, '20141101' FROM dual
UNION ALL SELECT 2, '20141102' FROM dual
UNION ALL SELECT 2, '20141103' FROM dual
UNION ALL SELECT 2, '20141104' FROM dual
UNION ALL SELECT 2, '20141130' FROM dual
UNION ALL SELECT 2, '20141201' FROM dual)
--위의 Base정보를 가지고 아래와 같은 결과를 도출해 보세요.
NO FROM_DT TO_DT CNT
---------- ---------------- ---------------- ----------
1 20141101 20141103 3
1 20141105 20141106 2
1 20141109 20141109 1
1 20141120 20141120 1
2 20141101 20141104 4
2 20141130 20141201 2
* 풀이.
순차적으로 정렬된 날짜값에서 Rownum을 뺀 값은 날짜가 연속적일 경우 같은 날짜 값이 나오게 되며,
연속적이지 않은 경우에는 다른값이 나오게 된다는 점을 이용. <Ref. 1>
이 값을 Order by와 Group by 함수를 이용하여 문제 해결.
* 결과값.
연속된 날짜 구간의 일수 찾기 퀴즈의 정답을 알아볼까요?
이 문제의 핵심은 어떻게 연속되는 구간의 날짜를 찾아 그룹을 만들어 일수를 세는 것 입니다.
그렇다면 중간 중간 띄어져 있는 날짜들의 연속된 구간을 찾을 수 있을까요?
이 의문의 정답은 오라클 8.1.6부터 추가된 분석함수의 기능 중 하나를 쓰면 해결할 수 있습니다.
바로 LAG함수이죠.
이제 어떻게 풀어나가는지 같이 해보도록 해요.