mySQL - 根据连续差异对值进行分组

时间:2014-10-08 12:37:00

标签: mysql sql datetime

我的数据库中有一个包含ID和DATETIME列的表,这里有一些示例数据:

ID   |   DATETIME
1    |   2014-05-06 01:12
1    |   2014-05-06 01:30
1    |   2014-05-06 01:45
1    |   2014-05-06 02:59
2    |   2014-05-06 01:17
2    |   2014-05-06 01:18
2    |   2014-05-06 01:19
2    |   2014-05-06 02:00

我需要生成一个查询,该查询确定属于对象的ID,该对象的DATETIME值之间的时间最长,其中连续DATETIME值之间的时间不超过20分钟。

例如,在示例数据中,我希望返回1,因为它具有来自DATETIME的{​​{1}}值,而(01:12 - 01:45)值之间没有20分钟的连续差异。

感谢。

2 个答案:

答案 0 :(得分:0)

看起来你需要一个自我加入。因为如果你有一个ID的10个条目,你的20分钟差距可能在条目3-6对1-4或甚至4-9之间。因此,连接的第二个实例将位于相同的ID上,并且日期时间高于主条目的日期时间,但不到20分钟。然后,它可以按时间间隔排序并限制为您想要的那个。类似的东西:

select
      YT.ID,
      YT.DTColumn,
      MAX( YT2.DTColumn ) as MaxDateWithin20Minutes
   from
      YourTable YT
         JOIN YourTable YT2
            ON YT.ID = YT2.ID
           AND YT.DTColumn < YT2.DTColumn
           AND YT2.DTColumn <= date_add( YT.DTColumn, INTERVAL 20 MINUTE )
   group by
      YT.ID,
      YT.DTColumn
   order by
      timediff(MAX( YT2.DTColumn ), YT.DTColumn) DESC
   limit 
      1

答案 1 :(得分:0)

您需要获取下一个(或上一个)值并获得时差。我认为以下是您想要的:

select t.*
from (select t.*,
             (select t2.datetime
              from table t2
              where t2.id = t.id and t2.datetime < t.datetime
              order by t2.datetime desc
             ) prev_datetime
      from table t
     ) t
where datetime <= prev_datetime + interval 20 minutes
order by timestampdiff(second, prev_datetime, datetime) desc
limit 1;