【问题标题】:MySQL: Find successive rows, where timestamp difference is less than xMySQL:查找连续行,其中时间戳差小于 x
【发布时间】:2013-07-05 12:56:23
【问题描述】:

Mysql: Find rows, where timestamp difference is less than x 的副本

我的表格如下:

Field       Type
id              int(11)
user            varchar(64)
date        int(11)
key             int(11)

日期采用时间戳格式。 我正在寻找一种方法来查找所有行,其中连续行之间的时间戳差异小于 x。是否可以?

【问题讨论】:

标签: mysql


【解决方案1】:

这是可能的,假设时间戳表示date。这是一个使用相关子查询来获取下一个date 值的版本:

select t.*
from (select t.*,
             (select date
              from yourtable t2
              where t2.date > t.date
              order by t2.date
              limit 1
             ) as NextDate
      from yourtable t
     ) t
where <difference calculation goes here>;

编辑:

以上是标准SQL。在 MySQL 中,您也可以使用变量来执行此操作。

select t.*
from (select t.*, @nextdate as nextdate, @nextdate := date
      from yourtable t
      order by date desc
     ) t
where <difference calculation goes here>;

这种方法有两个问题。首先,变量的使用需要对结果集进行顺序处理(在 MySQL 中这不是什么大问题,因为我认为无论如何都会发生这种情况)。更重要的是,不能保证select 的评估顺序。换句话说,这可能有效,但不能保证有效。

顺便说一句,许多其他数据库都支持lead() 函数,这将是执行此操作的“正确”方式。不幸的是,MySQL 不支持窗口函数。

【讨论】:

  • 而且日期差应该看起来像“t2.date - t2.date
  • @PsychoX 。 . . datediff() 或减法可以让您获得天数的差异。如果您需要更精致的单元,那么timediff() 就是您所需要的。或者,您可以转换为 Unix 时间戳。有(太多)方法可以在 MySQL 中获取日期/时间的差异,所以我故意将其保持打开状态。
  • 嗯...不幸的是,这个查询太慢了。有没有其他方法可以做到这一点?
  • @PsychoX 。 . .在yourtable(date) 上添加索引。这将有很大帮助。
  • 感谢您的宝贵时间和帮助 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-30
  • 1970-01-01
  • 2020-10-21
  • 1970-01-01
  • 2023-02-26
  • 2017-03-13
  • 1970-01-01
相关资源
最近更新 更多