[SQL] 제거 및 날짜 범위를 중복 감소
SQL제거 및 날짜 범위를 중복 감소
이 같은 두 부분과 완전히 겹치는 날짜로 구성된 날짜 범위 세트를 가지고 :
UserID StartDate EndDate
====== ========== ==========
1 2011-01-01 2011-01-02 <- A
1 2011-01-01 2011-01-10 <- A
1 2011-01-08 2011-02-15 <- A
1 2011-02-20 2011-03-10 <- B
2 2011-01-01 2011-01-20 <- C
2 2011-01-15 2011-01-25 <- C
T-SQL을 사용하여, 나는 제거는이 같은 결과 범위를 확장하고 필요에 중복 데이터를 제거, 데이터를 중복으로, 사용자 당, 새로운 데이터 세트를 생성하고 싶습니다 :
UserID StartDate EndDate
====== ========== ==========
1 2011-01-01 2011-02-15 ('A', three rows combined, extending the range)
1 2011-02-20 2011-03-10 ('B', no change, no overlaps here)
2 2011-01-01 2011-01-25 ('C', two rows combined)
필요한 경우 커서는 잘하지만, 내가 그들을없이 할 수 있다면 그것은 더 나은 것입니다.
해결법
-
==============================
1.SQL 서버 2005 +의 경우
SQL 서버 2005 +의 경우
-- sample table with data declare @t table(UserID int, StartDate datetime, EndDate datetime) insert @t select 1, '20110101', '20110102' union all select 1, '20110101', '20110110' union all select 1, '20110108', '20110215' union all select 1, '20110220', '20110310' union all select 2, '20110101', '20110120' union all select 2, '20110115', '20110125' -- your query starts below select UserID, Min(NewStartDate) StartDate, MAX(enddate) EndDate from ( select *, NewStartDate = t.startdate+v.number, NewStartDateGroup = dateadd(d, 1- DENSE_RANK() over (partition by UserID order by t.startdate+v.number), t.startdate+v.number) from @t t inner join master..spt_values v on v.type='P' and v.number <= DATEDIFF(d, startdate, EndDate) ) X group by UserID, NewStartDateGroup order by UserID, StartDate
노트:
from https://stackoverflow.com/questions/5213484/eliminate-and-reduce-overlapping-date-ranges by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 두 번째 필드를 자동 증가로 두 필드의 SQL 서버 고유 복합 키 (0) | 2020.05.24 |
---|---|
[SQL] 동적으로 생성 된 테이블에서 엔티티 프레임 워크를 사용하여 데이터를 쿼리 (0) | 2020.05.24 |
[SQL] 어떻게 반복의 MyBatis의 foreach에서의 HashMap을 통해? (0) | 2020.05.24 |
[SQL] UNION ALL 대 OR 조건 SQL 서버 쿼리 (0) | 2020.05.24 |
[SQL] 어떻게 sqlite가 테이블 안에 데이터가 있는지 확인할 수 있습니까? (0) | 2020.05.24 |