이번에는 연속되는 구간의 날짜를 그룹으로 묶어 그룹내 구간요일을 구해보는 SQL을 만들어 보는 시간을 가져보아요.
문제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
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 |
1.문제 풀이
2.풀이 과정
3.결과
About the Author
View all posts by 김지룡● (주)더비소프트 SI&ITO사업부 / ERP사업팀 팀원
● 경력 5년(현 LG전자 GERP DBA/Tuning 업무)
● 경력 5년(현 LG전자 GERP DBA/Tuning 업무)
* 풀이.
순차적으로 정렬된 날짜값에서 Rownum을 뺀 값은 날짜가 연속적일 경우 같은 날짜 값이 나오게 되며,
연속적이지 않은 경우에는 다른값이 나오게 된다는 점을 이용. <Ref. 1>
이 값을 Order by와 Group by 함수를 이용하여 문제 해결.
* 결과값.
연속된 날짜 구간의 일수 찾기 퀴즈의 정답을 알아볼까요?
이 문제의 핵심은 어떻게 연속되는 구간의 날짜를 찾아 그룹을 만들어 일수를 세는 것 입니다.
그렇다면 중간 중간 띄어져 있는 날짜들의 연속된 구간을 찾을 수 있을까요?
이 의문의 정답은 오라클 8.1.6부터 추가된 분석함수의 기능 중 하나를 쓰면 해결할 수 있습니다.
바로 LAG함수이죠.
이제 어떻게 풀어나가는지 같이 해보도록 해요.