sql >> Databasteknik >  >> RDS >> Sqlserver

Eliminera och minska överlappande datumintervall

För SQL Server 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

Anmärkningar:

  1. Ersätt @t med ditt bordsnamn



  1. Normalisera arraysänkningar för 1-dimensionell array så att de börjar med 1

  2. Förstå vyer i SQL

  3. Varför postgres inte använder indexet i min fråga

  4. Returnera partitionsnumret för varje rad när du frågar efter en partitionerad tabell i SQL Server (T-SQL)