最孤立的记录

时间:2012-10-17 22:28:09

标签: mysql

考虑带有datetime字段的MySQL表。我想选择行之间的最长时间到下一个或前一个datetime值之间的行。例如,如果存在具有以下值的记录:

1   2012-10-17 12:00
2   2012-10-16 12:00
3   2012-10-14 12:00
4   2012-10-08 12:00
5   2012-10-03 12:00
6   2012-10-01 12:00

因此,最“孤立”的记录是记录#4,因为距离最近的记录只有5天。

请注意,“最隔离”可能存在或可能没有关系,在这种情况下,可以返回任何绑定行,或者全部返回。此外,尽管该示例显示了按顺序排列datetime个值的记录,但在实际数据集中可能不一定如此。

2 个答案:

答案 0 :(得分:3)

如果您的表定义为foo(id,time),则可以使用以下sql:

SELECT t1.id FROM foo t2
   INNER JOIN foo t1 ON t1.id=t2.id+1
   INNER JOIN foo t3 ON t3.id=t1.id+1
  WHERE timestampdiff(day,t1.time,t2.time)+timestampdiff(day,t3.time,t1.time)=
    (SELECT max(timestampdiff(day,t1.time,t2.time)+timestampdiff(day,t3.time,t1.time))
         FROM foo t2 INNER JOIN foo t1 ON t1.id=t2.id+1 
                     INNER JOIN foo t3 ON t3.id=t1.id+1)

获取所有“最孤立”的条目。如果您只需要一个条目,则可以随时添加limit 1 另请注意,这里我们假设条目按时间戳排序。如果条目未按时间排序,您可以创建将对其进行排序的视图。

sqlfiddle

答案 1 :(得分:1)

您可以使用它来确定距离最近记录的距离:

SELECT foo.d, TIMESTAMPDIFF(DAY, max(earlier.d), d) as previous, TIMESTAMPDIFF(DAY, d, min(later.d)) as next
FROM foo
LEFT JOIN foo later ON foo.d < later.d
LEFT JOIN foo earlier ON foo.d > earlier.d
GROUP BY foo.d

您可以非常轻松地获得最远的这些值。