Alih-alih membandingkan dengan tanggal pembatalan di baris sebelumnya, Anda perlu membandingkan dengan tanggal pembatalan terbaru di semua baris sebelumnya. SQL standar memiliki opsi ABAIKAN NULLS untuk mencapai ini, tetapi MySQL tidak mendukungnya. Untungnya dalam kasus Anda itu dapat ditulis ulang menggunakan Maks Kumulatif:
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;
Lihat biola