Anda dapat mencoba ini - saya tidak akan menjamin bahwa itu akan berkinerja lebih baik, tetapi ini adalah cara saya yang biasa untuk menghubungkan baris dengan baris "sebelumnya":
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)
(Saya pikir ini benar - dapat dilakukan dengan beberapa sampel data untuk memvalidasinya).
Pada dasarnya, idenya adalah untuk menggabungkan tabel dengan dirinya sendiri, dan untuk setiap baris (dalam d
), temukan baris kandidat (di d_prev
) untuk baris "sebelumnya". Kemudian lakukan join lebih lanjut, untuk mencoba menemukan baris (di d_inter
) yang ada di antara baris saat ini (di d
) dan baris kandidat (di d_prev
). Jika kita tidak dapat menemukan baris seperti itu (d_inter.time is null
), maka kandidat itu memang baris sebelumnya.