Giả sử chúng ta chỉ có thể sử dụng start_date
để xác định các bản ghi liền kề (tức là không có khoảng trống), sau đó bạn có thể sử dụng phương pháp tiếp cận sự khác biệt của số hàng:
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;
Để xem cách này hoạt động như thế nào, hãy xem kết quả của truy vấn con. Bạn sẽ có thể "thấy" sự khác biệt của hai số hàng xác định các nhóm bản ghi liền kề với cùng một tỷ lệ như thế nào.