Můžete využít obě výhody funkce oken
a použití konceptu zvaného gaps-and-islands
. Ve vašem případě by sousední data představovala ostrov a mezery jsou samozřejmé.
Odpověď níže jsem napsal podrobným způsobem, aby bylo jasné, co dotaz dělá, ale s největší pravděpodobností by to mohlo být napsáno jiným způsobem, který je stručnější. Podívejte se prosím na mé komentáře v odpovědi vysvětlující, co každý krok (poddotaz) dělá.
--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