我的数据库中有一个包含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分钟的连续差异。
感谢。
答案 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;