Você pode aproveitar os dois funções da janela e o uso de um conceito chamado
gaps-and-islands
. No seu caso, datas contíguas seriam a ilha, e as lacunas são autoexplicativas. Eu escrevi a resposta abaixo de forma detalhada para ajudar a deixar claro o que a consulta está fazendo, mas provavelmente poderia ser escrita de uma maneira diferente, mais concisa. Por favor, veja meus comentários na resposta explicando o que cada etapa (sub-consulta) faz.
--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