날짜 구간안에 중복값 체크하기 0 2 1,760

by 마늘장아찌 [SQL Query] [2017.06.26 11:23:09]


sample  아래와 같이 작성하였습니다.

시작일과 종료일 사이에 코드1과 코드2값이 중복된게 있는지 체크하고 싶은데요,

즉, 두번째 데이터는 구간이 겹치지 않기 때문에 문제가 없고 첫번째와 세번째의 경우에는 겹치는 구간이

존재하면서 코드1과 코드2값이 같기 때문에 대상이 되어야 합니다.

기존에 Unique Key 설정이 없어서 추가를 하려고 하는데 날짜가 구간이라서 단순하게 체크하기가 어렵네요...

감사합니다.

아, Unique Key 설정도 문제가 좀 있네요...

시작일 종료일이 포함된 경우 물리적인 UK 설정이 안되고 (할수는 있지만 구간 체크가 안됨)

프로그램 로직상에서 Duplicate 체크할수 밖에 없나요?

 

WITH t AS
(SELECT 'A' cd_1, '01' cd_2, to_date('20170101','YYYYMMDD') st_date, to_date('20170131','YYYYMMDD') ed_dt FROM dual UNION ALL
 SELECT 'A', '01', to_date('20170301','YYYYMMDD'), to_date('20170331','YYYYMMDD') FROM dual UNION ALL
 SELECT 'A', '01', to_date('20170111','YYYYMMDD'), to_date('20170131','YYYYMMDD') FROM dual
 )
 SELECT * FROM t

by 마농 [2017.06.26 13:01:11]

1. 셀프조인으로 시작일 종료일을 교차비교 하시면 됩니다.
2. 중복 체크는 프로그램으로 해야 할 듯 합니다.
 

SELECT *
  FROM t m
 WHERE EXISTS (SELECT 1
                 FROM t s
                WHERE s.ROWID   != m.ROWID      -- 자기 자신 제외
                  AND s.cd_1     = m.cd_1
                  AND s.cd_2     = m.cd_2
                  AND s.st_date <= m.ed_dt      -- 시작일 종료일 교차 비교
                  AND s.ed_dt   >= m.st_date    -- 시작일 종료일 교차 비교
               )
;

 


by 마늘장아찌 [2017.06.26 14:00:08]

일전에도 구간 체크때문에 동일한 질문을 드렸었는데 답변주신 내용을 보니 기억이 납니다.

잘 저장해 놓겠습니다. 제가 시작, 종료일 컬럼명 기준을 다르게 드렸었네요..

하나는 dt로 하나는 date로... 다르게 드린거에 맞춰서 주시는 꼼꼼함 까지...

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