혼자 고민하다 고수님들의 고견을 얻고자 합니다.
소스자료는
이름 시작 종료
홍길동 1000 1500
홍길동 1100 1700
홍길동 1800 1900
강감찬 0900 1000
이순신 1000 1400
출력하고자 하는 자료는
홍길동 1000 1700
즉 중복을 제거하면서 최소시간부터 최고시간까지를 구하고자 합니다.
여러 고수님들의 고견을 기다리며....
create table test (name char(10), i1 integer, i2 integer);
insert into test values ('홍길동', 1000, 1500);insert into test values ('홍길동', 1100, 1700);insert into test values ('홍길동', 1800, 1900);insert into test values ('강감찬', 0900, 1000);insert into test values ('이순신', 1000, 1400);
select NAME, MIN(I1), MAX(I2) from TEST GROup by name;
NAME MIN(I1) MAX(I2) ----------------------------------------홍길동 1000 1900 강감찬 900 1000 이순신 1000 1400 3 rows selected.
이걸 말씀하시는건지요??
제가 원하는 답은
강참찬 900 1000
입니다.
즉 홍길동이 1100부터 1500까지 중복되어 있고
이를 제거하고 자료를 뽑아내고자 합니다.
고수님의 고견을 기다리며...
SELECT A.NAME, A.START_SEQ, A.END_SEQ FROM TEST_SQL A, (SELECT NAME, MIN(START_SEQ) AS START_SEQ FROM TEST_SQL GROUP BY NAME ) B WHERE A.NAME = B.NAME AND A.START_SEQ = B.START_SEQUNIONSELECT A.NAME, A.START_SEQ, A.END_SEQ FROM TEST_SQL A, (SELECT NAME, MAX(END_SEQ) AS END_SEQ FROM TEST_SQL GROUP BY NAME ) B WHERE A.NAME = B.NAME AND A.END_SEQ = B.END_SEQ
좀 무식해 보이는건가 ;;;
select name "name", min(i1) "start", i2 "end"from (select x.name, x.i1, (select max(y.i2) from "test" y where x.name = y.name and x.i2 between y.i1 and y.i2) from "test" x) as z(name, i1, i2)group by name, i2;=== <Result of SELECT Command in Line 13> ===
name start end================================================ '강감찬 ' 900 1000 '이순신 ' 1000 1400 '홍길동 ' 1000 1700 '홍길동 ' 1800 1900
4 rows selected.
오호~