Můžete zkusit toto – nezaručuji, že bude fungovat lépe, ale je to můj obvyklý způsob, jak porovnat řádek s „předchozím“ řádkem:
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)
(Myslím, že je to správné – mohl bych si vystačit s nějakými ukázkovými daty k ověření).
V zásadě jde o to, spojit tabulku k sobě a pro každý řádek (v d
), najděte kandidátní řádky (v d_prev
) pro "předchozí" řádek. Poté proveďte další spojení a pokuste se najít řádek (v d_inter
), který existuje mezi aktuálním řádkem (v d
) a řádek kandidáta (v d_prev
). Pokud takový řádek nemůžeme najít (d_inter.time is null
), pak byl tímto kandidátem skutečně předchozí řada.