Оконные рамы могут быть более производительными, но вам нужно будет их протестировать. Вот альтернативное решение:
select sgid, metric, min(startdate) as mindate, max(enddate) as maxdate
from (
select *,
sum(case when startdate > dateadd(day, 1, prev_enddate) then 1 else 0 end)
over(partition by sgid, metric order by startdate) as grp
from (
select
sgid, metric, startdate, enddate,
max(enddate)
over(partition by sgid, metric order by startdate
rows between unbounded preceding and 1 preceding) as prev_enddate
from #consecutivedates
) x
) y
group by sgid, metric, grp
Результат (с более полным сценарием данных):
sgid metric mindate maxdate
---- ------ --------------------- ---------------------
2177 515818 2019-03-01 00:00:00.0 2019-03-31 00:00:00.0
2177 515818 2019-07-01 00:00:00.0 2019-09-30 00:00:00.0
2177 515818 2019-11-01 00:00:00.0 2019-11-30 00:00:00.0
2177 515820 2019-10-01 00:00:00.0 2019-10-31 00:00:00.0
Вот сценарий данных, который я использовал:
create table #consecutivedates (sgid nvarchar(max), metric nvarchar(max),
targetvalue nvarchar(max), startdate datetime, enddate datetime);
insert into #consecutivedates values
('2177', '515818', '18', '2019-09-01', '2019-09-30'),
('2177', '515818', '125', '2019-08-01', '2019-08-31'),
('2177', '515818', '15', '2019-07-01', '2019-07-31'),
('2177', '515820', '15', '2019-10-01', '2019-10-31'),
('2177', '515818', '15', '2019-03-01', '2019-03-31'),
('2177', '515818', '15', '2019-11-01', '2019-11-30')