MySql - 在 select 语句中选择前一行以比较时差的最佳方式?

标签 mysql performance datetime

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

SELECT t.ID,t.Datetime from table t where (...) ORDER BY t.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 中表达式的求值顺序):

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;

关于MySql - 在 select 语句中选择前一行以比较时差的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27772077/

相关文章:

mysql - 条件查询mysql

mysql - Radipanel SQL 查询错误的违规行为

c# - 无法解析格式为 2013-09-17T05 :15:27. 947 的日期字符串

php - fatal error :未捕获异常 ‘Exception’,消息为“DateTime::__construct():

c# - 时刻.js : Convert UTC date from database into local time

javascript - 如何(SELECT *)node.js 中的两个 mysql 表(express)

MySQL查询限制偏移查询的优化

c# - 最有效的遍历数组

c - Linux下的硬件读写函数

asp.net - 减少应用程序构建/调试时间的方法