계약날짜 이어서 쿼리로 뽑을 수 있을까요? 1 2 2,516

by 변우정 [SQL Query] 계약 날짜 날짜이어주기 [2023.04.25 16:15:34]


안녕하세요 ~* 간단한 질문일수도 있는데 생각이 안나서 문의드립니다.

 

계약테이블이 있는데 거기에 이름, 계약시작일, 계약종료일 컬럼이3개가 있다고 하면요.

이름 | 계약시작일| 계약종료일 |

홍길동|20210101|20210331|

홍길동|20210405|20210425|

홍길동|20210426|20210430|

홍길동|20210501|20211231|

홍길동|20220104|20220131|

이렇게 데이터가 5건이 들어있다고 하면  쿼리로 어떻게 이어져 있는 계약만 뽑아올 수 있을까요?

홍길동|20210405|20211231| <===요렇게 이어져 있는 3건의 최소값 최대값을 뽑아내고 싶어서요. ㅠㅠ

 

다들 바쁘실텐데 답변 주시면 정말 감사할거 같습니다. (--)(__)

by 마농 [2023.04.25 17:15:51]
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

 


by 쿼링 [2023.04.27 12:29:25]

회원가입은 오늘에서야 했지만, 수 년간 최소 1일 1회 꾸준히 사이트 방문하면서 마농님 포함한 고수분들 쿼리 어깨 너머로 힐끗힐끗하면서 배우고있는 직장인입니다. 

본 질문과 답변을 사이트에서 몇 번 봐 왔지만, 볼 때마다 늘 기분이 좋습니다 ㅋㅋ (필요한 질문, 기막힌 답변)

특히 원자료(raw : start_dt, end_dt)에만 집중할 경우 문제 해결이 막막한 경우가 있는데, 

약간 시야를 넓혀, 새로운 참고 자료를 만들어 내면서 문제를 해결하는 마농님 센스에 늘 감탄하고 있습니다!

앞으로 더 자주 방문하도록 하겠습니다^^

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입