これを試してみてください-パフォーマンスが向上することを保証するつもりはありませんが、行を「前の」行と関連付ける通常の方法です:
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
)、その候補は確かに前の行でした。