Thay vì so sánh với ngày hủy trong hàng trước đó, bạn cần so sánh với ngày hủy gần nhất trong tất cả các hàng trước đó. SQL tiêu chuẩn có tùy chọn BỎ QUA NULLS để đạt được điều này, nhưng MySQL không hỗ trợ nó. May mắn thay, trong trường hợp của bạn, nó có thể được viết lại bằng cách sử dụng Giá trị tối đa tích lũy:
select t.*,
datediff(start, prev_cancelled) as num_days_since_cancel
from (select dt.*,
max(cancelled) over -- latest date per id
(partition by id
order by start
rows between unbounded preceding and 1 preceding) as prev_cancelled
from dt
) t
-- remove negative duration
where datediff(start, prev_cancelled) >= 0;
Xem fiddle