sql >> Database teknologi >  >> RDS >> Sqlserver

Eliminer og reducer overlappende datointervaller

Til 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

Bemærkninger:

  1. Erstat @t med dit bordnavn



  1. Oracle:funktion baseret indeks selektiv unikhed

  2. Sådan masseindsætter du kun nye rækker i PostreSQL

  3. Hvordan administrerer man bedst historiske opslagsværdier i en database?

  4. 2 måder at returnere rækker, der ikke indeholder numeriske værdier i Oracle