환절기 입니다..감기조심 하세여..
이곳에 많은 질문과 답을 얻고 있는 초보 델피언입니다.
DB 관련해서 공부를 하고 있느데요..
이걸 어떻게 질문 드려야 할지 고민입니다.
db 오라클이구요..
테이블명 123
필드구성
행 고객번호 시작 끝
1 001 20010101 20010228
2 001 20010301 20010430
3 001 20010401 20010531
4 001 20010501 20010731
5 003 20010101 20010228
6 003 20010201 20010430
7 003 20010401 20010531
8 003 20010601 20010731
9 003 20010101 20010228
10 005 20010301 20010430
11 005 20010401 20010531
12 005 20010601 20010731
13 006 20010101 20010228
14 006 20010301 20010430
15 006 20010401 20010531
16 007 20010601 20010731
.
.
.
.
이렇게 구성이 되어 있구요..
여기서 고객번호는 중복이 있구요..
맨위 행(1) '끝' 과 (2) 행 '시작'을 비교해서 (2)행 '시작'이 크면
추출하고 아니면 (2)행 '끝' 과 (3)행 '시작을 비교하고..
고객번호가 바뀌면 그 고객번호의 처음부터 다시 하는거거든요..
빈 고객번호도 있구요...
결과:
그리드에
001 20010401 20010531
001 20010501 20010731
003 20010201 20010430
003 20010401 20010531
003 20010101 20010228
005 20010401 20010531
.
.
.
.
이렇게 나오면 되는겁니다.
설명드리기도 힘드네요...
머리에서 빙빙돌기만 하고 ..도와 주세요..
감사합니다.
해결 방법은
1. Inline view를 만들어서 rowid가 자신의 rowid에 대해서
큰 것을 비교하여 끝과 다음행(rowid가 큰 view에서 참조되는 시작)비교
하여 출력
(모든 oracle 버젼에서 구현가능)
2. analytic function을 사용하여 다음행의 시작을 가져와
현 행의 끝과 비교하여 조건이 맞다면 출력
(단점, Oracle 8i부터 지원함)
1. select 고객번호, 시작, 끝1
from (
select b.고객번호, b.시작 시작, b.끝1, a.시작 끝2
from table1 a,
table1 b
where a.rowid > b.rowid
)
where 끝1 <= 끝2
이것 비스무리하게 되지 않을까여?
2. select 고객번호, 시작 , 끝
from (
select 고객번호, 시작, 끝 끝1,
nvl(lead(시작,1) over (partition by 고객번호 order by 고객번호, 시작), 끝) 끝2
from table
)
where 끝1 <= 끝2
요렇게 하면 안될가여???
될텐데..