Je zou dit kunnen proberen - ik ga niet garanderen dat het beter zal presteren, maar het is mijn gebruikelijke manier om een rij te correleren met een "vorige" rij:
SELECT
* --TODO, list columns
FROM
data d
left join
data d_prev
on
d_prev.time < d.time --TODO - Other key columns?
left join
data d_inter
on
d_inter.time < d.time and
d_prev.time < d_inter.time --TODO - Other key columns?
WHERE
d_inter.time is null AND
(d_prev.value is null OR d_prev.value <> d.value)
(Ik denk dat dit juist is - zou wat voorbeeldgegevens kunnen gebruiken om het te valideren).
In principe is het idee om de tabel aan zichzelf toe te voegen, en voor elke rij (in d
), zoek kandidaat-rijen (in d_prev
) voor de "vorige" rij. Doe dan nog een join, om te proberen een rij te vinden (in d_inter
) die bestaat tussen de huidige rij (in d
) en de kandidatenrij (in d_prev
). Als we zo'n rij niet kunnen vinden (d_inter.time is null
), dan was die kandidaat inderdaad de vorige rij.