您可以尝试一下-我不保证它的性能会更好,但这是我通常将行与“上一个”行相关联的方式:
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
存在于当前行(ind
)和候选行(in d_prev
)之间的行(in )。如果我们找不到这样的行(d_inter.time is null
),则该候选项确实是前一行。