Може да опитате това - няма да гарантирам, че ще работи по-добре, но това е обичайният ми начин да съпоставя ред с "предишен" ред:
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)
(Мисля, че това е правилно - може да се направи с някои примерни данни, за да се потвърди).
По принцип идеята е да се присъедини таблицата към себе си и за всеки ред (в d
), намерете редове кандидати (в d_prev
) за "предходния" ред. След това направете още едно присъединяване, за да опитате да намерите ред (в d_inter
), който съществува между текущия ред (в d
) и ред кандидат (в d_prev
). Ако не можем да намерим такъв ред (d_inter.time is null
), тогава този кандидат наистина е бил на предишния ред.