Sie könnten dies versuchen - ich werde nicht garantieren, dass es besser funktioniert, aber es ist meine übliche Methode, eine Zeile mit einer "vorherigen" Zeile zu korrelieren:
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)
(Ich denke, das ist richtig - könnte einige Beispieldaten gebrauchen, um es zu validieren).
Grundsätzlich besteht die Idee darin, die Tabelle mit sich selbst zu verbinden und für jede Zeile (in d
), finden Sie Kandidatenzeilen (in d_prev
) für die "vorherige" Zeile. Führen Sie dann einen weiteren Join durch, um zu versuchen, eine Zeile zu finden (in d_inter
), die zwischen der aktuellen Zeile (in d
) und die Kandidatenzeile (in d_prev
). Wenn wir eine solche Zeile nicht finden können (d_inter.time is null
), dann war dieser Kandidat tatsächlich die vorherige Reihe.