Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 最孤立的记录_Mysql - Fatal编程技术网

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天 请注意,对于大多数孤立的行,可能存在也可能不存在连接,在这种情

考虑一个带有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天


请注意,对于大多数孤立的行,可能存在也可能不存在连接,在这种情况下,可以返回任何连接行,或者返回所有连接行。此外,尽管该示例显示了日期时间值按顺序排列的记录,但在实际数据集中可能不一定如此。

您可以使用该示例来确定到最近记录的距离:

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:实际上,两种方法都可以接受。我很想看看这两种方法是如何实现的。谢谢你,加入“少于”是非常聪明的!我会玩一下这个,很快回来。谢谢你,加入“少于”是非常聪明的!我会处理好这件事,很快回来。