Angenommen, wir können einfach start_date
verwenden Um die benachbarten Datensätze zu identifizieren (d. h. es gibt keine Lücken), können Sie den Ansatz der Differenz der Zeilennummern verwenden:
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;
Um zu sehen, wie das funktioniert, sehen Sie sich die Ergebnisse der Unterabfrage an. Sie sollten in der Lage sein zu "sehen", wie die Differenz der beiden Zeilennummern die Gruppen benachbarter Datensätze mit derselben Rate definiert.