Du kan dra nytta av både fönsterfunktioner
och användningen av ett koncept som kallas gaps-and-islands
. I ditt fall skulle sammanhängande datum vara ön, och luckorna är självförklarande.
Jag skrev svaret nedan på ett utförligt sätt för att göra det tydligt vad frågan gör, men det kan med största sannolikhet skrivas på ett annat sätt som är mer kortfattat. Se mina kommentarer i svaret som förklarar vad varje steg (underfråga) 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