2

考虑一个带有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按顺序排列的值,但在真实数据集中可能不一定如此。

4

2 回答 2

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

于 2012-10-17T23:42:12.043 回答
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

您可以很容易地获得这些值中最远的值。

于 2012-10-17T22:48:21.387 回答