복붙노트

[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. ==============================

    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
    

    노트:

  2. from https://stackoverflow.com/questions/5213484/eliminate-and-reduce-overlapping-date-ranges by cc-by-sa and MIT license