您可以尝试一下-我不保证它的性能会更好,但这是我通常将行与“上一个”行相关联的方式:
SELECt * --TODO, list columnsFROM data d left join data d_prev ond_prev.time < d.time --TODO - Other key columns? left join data d_inter ond_inter.time < d.time andd_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存在于当前行(in
d)和候选行(in
d_prev)之间的行(in )。如果我们找不到这样的行(
d_inter.time isnull),则该候选项确实是前一行。



