2014-10-08 63 views
0

我在我的数据库中包含的ID和DATETIME列的表分组值,这里是一些样本数据:MySQL的 - 基于连续的差异

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,因为它具有(01:12 - 01:45)DATETIME值,而在DATETIME值之间没有20分钟的连续差异。

谢谢。

回答

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 
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;