그룹 | 아이디 | 이름 | 주소 | 시작일 | 종료일 |
A | APPLE | 사과 | 서울 서초구 | 20180101 | 20180131 |
A | ANIMAL | 동물 | 서울 강서구 | 20180401 | 20180531 |
A | ANIMAL | 동물 | 서울 강남구 | 20180101 | 20180230 |
A | APPLE | 사과 | 서울 종로구 | 20180501 | 20180731 |
A | ANT | 개미 | 서울 서초구 | 20180104 | 20180131 |
A | ANT | 개미 | 서울 강서구 | 20180201 | 20180331 |
A | ANY | 애니 | 서울 강남구 | 20180101 | 20180130 |
A | ANY | 애니 | 서울 종로구 | 20180131 | 20180531 |
A | ANY | 애니 | 서울 서초구 | 20180601 | 20180630 |
A ~ F 그룹이 있는데
해당 그룹 이면서 시작일과 종료일 겹치는게 1개월 이상 되는 항목을 뽑을 수 있을까요?????
예를 들어 사과를 기준으로 한다고 한다면
A | ANIMAL | 동물 | 서울 강남구 | 20180101 | 20180230 |
A | ANY | 애니 | 서울 강남구 | 20180101 | 20180130 |
A | ANY | 애니 | 서울 서초구 | 20180601 | 20180630 |
이 나와야 합니다.
날짜 조회중에 겹치는 날짜에 대해서 조회가 되는게 있는지도 궁금합니다.
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 28 | WITH t AS ( SELECT 'A' grp, 'APPLE' id, '사과' nm, '서울 서초구' addr, '20180101' sdt, '20180131' edt FROM dual UNION ALL SELECT 'A' , 'ANIMAL' , '동물' , '서울 강서구' , '20180401' , '20180531' FROM dual UNION ALL SELECT 'A' , 'ANIMAL' , '동물' , '서울 강남구' , '20180101' , '20180230' FROM dual UNION ALL SELECT 'A' , 'APPLE' , '사과' , '서울 종로구' , '20180501' , '20180731' FROM dual UNION ALL SELECT 'A' , 'ANT' , '개미' , '서울 서초구' , '20180104' , '20180131' FROM dual UNION ALL SELECT 'A' , 'ANT' , '개미' , '서울 강서구' , '20180201' , '20180331' FROM dual UNION ALL SELECT 'A' , 'ANY' , '애니' , '서울 강남구' , '20180101' , '20180130' FROM dual UNION ALL SELECT 'A' , 'ANY' , '애니' , '서울 종로구' , '20180131' , '20180531' FROM dual UNION ALL SELECT 'A' , 'ANY' , '애니' , '서울 서초구' , '20180601' , '20180630' FROM dual ) SELECT a.grp , a.id id_a, a.sdt sdt_a, a.edt edt_a , b.id id_b, b.sdt sdt_b, b.edt edt_b , GREATEST(a.sdt, b.sdt) sdt_dup , LEAST (a.edt, b.edt) edt_dup FROM t a , t b WHERE a.grp = b.grp AND a.id != b.id AND a.sdt <= b.edt AND b.sdt <= a.edt AND a.grp = 'A' AND a.id = 'APPLE' AND MONTHS_BETWEEN( TO_DATE(LEAST (a.edt, b.edt), 'yyyymmdd' ) + 1 , TO_DATE(GREATEST(a.sdt, b.sdt), 'yyyymmdd' ) ) >= 1 ; |