이화식 선생님이 대표로 있는 En-Core 사이트 두번째 퀴즈 문제.
아래와 같은 SAMPLE 테이블이 있다고 하자.
성명 |
시작일 |
종료일 |
홍길동 |
19961001 |
19981230 |
홍길동 |
19981230 |
19990605 |
홍길동 |
19990605 |
19991002 |
홍길동 |
20000201 |
20000301 |
홍길동 |
20000501 |
99991231 |
김동훈 |
19910106 |
19910731 |
김동훈 |
19910731 |
19940201 |
김동훈 |
19940201 |
19941021 |
김동훈 |
19941021 |
19961031 |
김동훈 |
19990501 |
20000331 |
김동훈 |
20000331 |
99991231 |
마동탁 |
19980103 |
19980727 |
마동탁 |
19980727 |
20000103 |
마동탁 |
20000103 |
20000601 |
마동탁 |
20000601 |
99991231 |
. |
. |
. |
. |
. |
. |
어떤 특정 사원은 이력이 중간에 끊어진 경우가 있는데 이러한 끊어진 시작일과 종료일을 추출하고자 한다.
사원별로 끊어진 시작일과 종료일을 추출하면 아래와 같은 결과가 나타난다.
성명 |
시작일 |
종료일 |
홍길동 |
19991002 |
20000201 |
홍길동 |
20000301 |
20000501 |
김동훈 |
19961031 |
19990501 |
●문제 : 위와 같은 결과를 추출할 수 있는 한개의 SQL문을 작성하시오
내가 작성한 답안 :
select a.name, b.end, a.start
from test.quiz2 a, test.quiz2 b
where a.start <> b.end
and a.rowid - 1 = b.rowid
and a.name = b.name
group by b.rowid;
모범답안 :
select name, end_r start_date, start_l end_date
from (select name, sum(decode(no,1,start_dt)) start_l, sum(decode(no,1,end_dt)) end_l,
sum(decode(no,2,start_dt)) start_r, sum(decode(no,2,end_dt)) end_r
from (select name, start_dt, end_dt, rownum rn
from (select name, start_dt, end_dt
from quiz2
order by name, start_dt, end_dt )) x, copy_t y
where y.no <= 2
group by name, decode(no,1,rn,rn+1)
)
where end_r <> start_l;
댓글을 달아 주세요
댓글 RSS 주소 : http://www.yongbi.net/rss/comment/315