Du kan prøve dette - jeg vil ikke garantere, at det vil fungere bedre, men det er min sædvanlige måde at korrelere en række med en "forrige" række på:
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)
(Jeg tror, det er rigtigt - kunne godt trænge til nogle eksempeldata for at validere det).
Grundlæggende er ideen at forbinde tabellen med sig selv og for hver række (i d
), find kandidatrækker (i d_prev
) for den "forrige" række. Foretag derefter en yderligere join for at prøve at finde en række (i d_inter
), der findes mellem den aktuelle række (i d
) og kandidatrækken (i d_prev
). Hvis vi ikke kan finde sådan en række (d_inter.time is null
), så var den kandidat faktisk den forrige række.