Для этой версии проблемы я бы использовал lag()
, чтобы определить, где начинаются группы, затем накопленную сумму и агрегацию:
select dimensionid, DimensionAttribute,
min(row_start_date), max(row_end_date)
from (select t.*,
sum(case when prev_red = dateadd(day, -1, row_start_date)
then 0 else 1
end) over (partition by dimensionid, DimensionAttribute order by row_start_date) as grp
from (select t.*,
lag(row_end_date) over (partition by dimensionid, DimensionAttribute order by row_start_date) as prev_red
from t
) t
) t
group by dimensionid, DimensionAttribute, grp;
В частности, это распознает пробелы в строках. Он будет объединять строки только тогда, когда они точно совпадают друг с другом - предыдущая дата окончания - за один день до даты начала. Конечно, это может быть изменено, чтобы обеспечить разрыв в 1 или 2 дня или допустить наложение.