Mysql
 sql >> Base de données >  >> RDS >> Mysql

Difficulté avec une longueur de décalage variable

Au lieu de comparer à la date d'annulation de la ligne précédente, vous devez comparer à la dernière date d'annulation de toutes les lignes précédentes. Le SQL standard a une option IGNORE NULLS pour y parvenir, mais MySQL ne la prend pas en charge. Heureusement, dans votre cas, il peut être réécrit en utilisant un Cumulative Max :

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;

Voir violon