Puede probar esto; no voy a garantizar que funcionará mejor, pero es mi forma habitual de correlacionar una fila con una fila "anterior":
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)
(Creo que esto es correcto, le vendría bien algunos datos de muestra para validarlo).
Básicamente, la idea es unir la tabla consigo misma y para cada fila (en d
), busque filas candidatas (en d_prev
) para la fila "anterior". Luego haga una unión adicional, para intentar encontrar una fila (en d_inter
) que existe entre la fila actual (en d
) y la fila candidata (en d_prev
). Si no podemos encontrar dicha fila (d_inter.time is null
), entonces ese candidato era de hecho la fila anterior.