sql >> Base de Datos >  >> RDS >> Mysql

Dificultad con longitud de retraso variable

En lugar de comparar con la fecha de cancelación en la fila anterior, debe comparar con la última fecha de cancelación en todas las filas anteriores. SQL estándar tiene una opción IGNORE NULLS para lograr esto, pero MySQL no la admite. Afortunadamente, en su caso, se puede reescribir usando un máximo acumulativo:

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;

Ver fiddle