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.