Ако приемем, че можем просто да използваме start_date
за идентифициране на съседните записи (т.е. няма пропуски), тогава можете да използвате подхода на разликата в номерата на редовете:
select id, min(start_date) as mn_date, max(end_date) as mx_date, rate
from (select t.*,
row_number() over (partition by id order by start_date) as seqnum_i,
row_number() over (partition by id, rate order by start_date) as seqnum_ir
from t
) t
group by id (seqnum_i - seqnum_ir), rate;
За да видите как работи това, погледнете резултатите от подзаявката. Трябва да можете да "видите" как разликата между числата на двата реда определя групите от съседни записи с еднаква скорост.