Du kan drage fordel af både vinduefunktioner
og brugen af et koncept kaldet gaps-and-islands
. I dit tilfælde ville sammenhængende datoer være øen, og hullerne er selvforklarende.
Jeg skrev svaret nedenfor på en udførlig måde for at gøre det klart, hvad forespørgslen gør, men det kunne højst sandsynligt skrives på en anden måde, der er mere kortfattet. Se venligst mine kommentarer i svaret, der forklarer, hvad hvert trin (underforespørgsel) gør.
--Determine Final output
select min(c.StartDate) as StartDate
, max(c.EndDate) as EndDate
from (
--Assign a number to each group of Contiguous Records
select b.ID
, b.StartDate
, b.EndDate
, b.EndDatePrev
, b.IslandBegin
, sum(b.IslandBegin) over (order by b.ID asc) as IslandNbr
from (
--Determine if its Contiguous (IslandBegin = 1, means its not Contiguous with previous record)
select a.ID
, a.StartDate
, a.EndDate
, a.EndDatePrev
, case when a.EndDatePrev is NULL then 1
when datediff(d, a.EndDatePrev, a.StartDate) > 1 then 1
else 0
end as IslandBegin
from (
--Determine Prev End Date
select tt.ID
, tt.StartDate
, tt.EndDate
, lag(tt.EndDate, 1, NULL) over (order by tt.ID asc) as EndDatePrev
from dbo.Table_Name as tt
) as a
) as b
) as c
group by c.IslandNbr
order by c.IslandNbr