MySql—在select语句中选择上一行以比较时差的最佳方法?

MySql—在select语句中选择上一行以比较时差的最佳方法?,mysql,performance,datetime,Mysql,Performance,Datetime,我需要从一个非常大的表中获取一个按日期时间排序的ID列表 几百万行。 此选择几乎立即给出一个结果(大约300行的结果) 作为一个额外字段,我还需要中“Datetime”字段的时差 此行和上一行。我想识别具有高时差的行 我试着把桌子连在一起。这些联接的性能非常好 糟糕。仅比较搜索结果中的行的最佳方法是什么?在这种情况下,最好的方法是使用变量。以下基本上是您想要的逻辑: SELECT t.*, @prevdt as prev_datetime, @prevdt := t.DateTime FROM

我需要从一个非常大的表中获取一个按日期时间排序的ID列表 几百万行。 此选择几乎立即给出一个结果(大约300行的结果)

作为一个额外字段,我还需要中“Datetime”字段的时差 此行和上一行。我想识别具有高时差的行

我试着把桌子连在一起。这些联接的性能非常好
糟糕。仅比较搜索结果中的行的最佳方法是什么?

在这种情况下,最好的方法是使用变量。以下基本上是您想要的逻辑:

SELECT t.*, @prevdt as prev_datetime, @prevdt := t.DateTime
FROM (SELECT t.ID, t.Datetime
      FROM table t
      WHERE (...)
      ORDER BY t.Datetime
     ) t CROSS JOIN
     (SELECT @prevdt := NULL) vars;
但是,最好将所有变量赋值放在一条语句中(MySQL不保证
select
中表达式的求值顺序):


你们可能会从答案中得到一些想法。它展示了如何使用变量将每一行与前一行进行比较。谢谢。这就是我要找的。我理解第一个街区,并让它开始工作。第二个块在prev_datetime中为每一行返回NULL,我还没有完全理解嵌套的IFs是如何工作的。读取时,每次都应返回
@prevdt
,并将t.Datetime分配给
@dt
,然后将其分配给
@prevdt
SELECT t.*, @prevdt as prev_datetime, @prevdt := t.DateTime
FROM (SELECT t.ID, t.Datetime
      FROM table t
      WHERE (...)
      ORDER BY t.Datetime
     ) t CROSS JOIN
     (SELECT @prevdt := NULL) vars;
SELECT t.*,
       if(@prevdt := @dt, if(@dt := t.DateTime, @prevdt, @prevdt),
          if(@dt := t.DateTime, @prevdt, @prevdt)) as prev_datetime
FROM (SELECT t.ID, t.Datetime
      FROM table t
      WHERE (...)
      ORDER BY t.Datetime
     ) t CROSS JOIN
     (SELECT @prevdt := NULL, @dt := NULL) vars;