पिछली पंक्ति में रद्द दिनांक की तुलना करने के बजाय आपको पिछली सभी पंक्तियों में नवीनतम रद्द दिनांक से तुलना करने की आवश्यकता है। इसे प्राप्त करने के लिए मानक SQL में IGNORE NULLS विकल्प है, लेकिन MySQL इसका समर्थन नहीं करता है। सौभाग्य से आपके मामले में इसे संचयी अधिकतम का उपयोग करके फिर से लिखा जा सकता है:
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;
देखें fiddle