Förutsatt att vi bara kan använda start_date
för att identifiera de intilliggande posterna (dvs. det finns inga luckor) kan du använda skillnaden mellan radnummermetoden:
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;
För att se hur detta fungerar, titta på resultaten av underfrågan. Du bör kunna "se" hur skillnaden mellan de två radnumren definierar grupperna av angränsande poster med samma hastighet.