Mysql 最孤立的记录
考虑一个带有datetime字段的MySQL表。我想选择距离下一个或上一个日期时间值最远的行。例如,如果存在具有以下值的记录:Mysql 最孤立的记录,mysql,Mysql,考虑一个带有datetime字段的MySQL表。我想选择距离下一个或上一个日期时间值最远的行。例如,如果存在具有以下值的记录: 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天 请注意,对于大多数孤立的行,可能存在也可能不存在连接,在这种情
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天
请注意,对于大多数孤立的行,可能存在也可能不存在连接,在这种情况下,可以返回任何连接行,或者返回所有连接行。此外,尽管该示例显示了日期时间值按顺序排列的记录,但在实际数据集中可能不一定如此。您可以使用该示例来确定到最近记录的距离:
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
您可以很容易地获得这些值中最远的值。您可以使用此值确定到最近记录的距离:
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
您可以很容易地获得这些值中最远的值。如果您的表定义为foo id,那么您可以使用以下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)
获取所有最孤立的条目。如果只需要一个条目,则始终可以添加限制1。
还要注意,这里我们假设条目是按时间戳排序的。如果条目未按时间排序,则可以创建一个视图来对其排序
如果表的定义类似于foo id,那么您可以使用以下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)
获取所有最孤立的条目。如果只需要一个条目,则始终可以添加限制1。
还要注意,这里我们假设条目是按时间戳排序的。如果条目未按时间排序,则可以创建一个视图来对其排序
通过隔离,您是查看上一条记录和下一条记录的平均值,还是2条记录中最小的一条记录?@PinnyM:实际上,这两种方法都是可以接受的。我很想看看这两种方法是如何实现的。通过隔离,你是看上一条记录和下一条记录的平均值,还是2条记录中最小的一条记录?@PinnyM:实际上,两种方法都可以接受。我很想看看这两种方法是如何实现的。谢谢你,加入“少于”是非常聪明的!我会玩一下这个,很快回来。谢谢你,加入“少于”是非常聪明的!我会处理好这件事,很快回来。