안녕하세요 ~* 간단한 질문일수도 있는데 생각이 안나서 문의드립니다.
계약테이블이 있는데 거기에 이름, 계약시작일, 계약종료일 컬럼이3개가 있다고 하면요.
이름 | 계약시작일| 계약종료일 |
홍길동|20210101|20210331|
홍길동|20210405|20210425|
홍길동|20210426|20210430|
홍길동|20210501|20211231|
홍길동|20220104|20220131|
이렇게 데이터가 5건이 들어있다고 하면 쿼리로 어떻게 이어져 있는 계약만 뽑아올 수 있을까요?
홍길동|20210405|20211231| <===요렇게 이어져 있는 3건의 최소값 최대값을 뽑아내고 싶어서요. ㅠㅠ
다들 바쁘실텐데 답변 주시면 정말 감사할거 같습니다. (--)(__)
WITH t AS
(
SELECT '홍길동' nm, '20210101' sdt, '20210331' edt FROM dual
UNION ALL SELECT '홍길동', '20210405', '20210425' FROM dual
UNION ALL SELECT '홍길동', '20210426', '20210430' FROM dual
UNION ALL SELECT '홍길동', '20210501', '20211231' FROM dual
UNION ALL SELECT '홍길동', '20220104', '20220131' FROM dual
)
SELECT nm
, MIN(sdt) sdt
, MAX(edt) edt
, COUNT(*) cnt
FROM (SELECT nm, sdt, edt
, SUM(flag) OVER(PARTITION BY nm ORDER BY sdt) grp
FROM (SELECT nm, sdt, edt
, DECODE( LAG(edt) OVER(PARTITION BY nm ORDER BY sdt)
, TO_CHAR(TO_DATE(sdt, 'yyyymmdd') - 1, 'yyyymmdd')
, 0, 1) flag
FROM t
)
)
GROUP BY nm, grp
-- HAVING COUNT(*) > 1 -- 이어진 계약만 추출
ORDER BY nm, grp
;
-- http://gurubee.net/lecture/2194
회원가입은 오늘에서야 했지만, 수 년간 최소 1일 1회 꾸준히 사이트 방문하면서 마농님 포함한 고수분들 쿼리 어깨 너머로 힐끗힐끗하면서 배우고있는 직장인입니다.
본 질문과 답변을 사이트에서 몇 번 봐 왔지만, 볼 때마다 늘 기분이 좋습니다 ㅋㅋ (필요한 질문, 기막힌 답변)
특히 원자료(raw : start_dt, end_dt)에만 집중할 경우 문제 해결이 막막한 경우가 있는데,
약간 시야를 넓혀, 새로운 참고 자료를 만들어 내면서 문제를 해결하는 마농님 센스에 늘 감탄하고 있습니다!
앞으로 더 자주 방문하도록 하겠습니다^^