1

我有一张桌子ACQUISITION,有 1 720 208 行。

------------------------------------------------------
| id           | date                    | value     |
|--------------|-------------------------|-----------|
| 1820188      | 2011-01-22 17:48:56     | 1.287     |
| 1820187      | 2011-01-21 21:55:11     | 2.312     |
| 1820186      | 2011-01-21 21:54:00     | 2.313     |
| 1820185      | 2011-01-20 17:46:10     | 1.755     |
| 1820184      | 2011-01-20 17:45:05     | 1.785     |
| 1820183      | 2011-01-19 18:21:02     | 2.001     |
------------------------------------------------------

出现问题后,我需要找到差异小于两分钟的每一行。

理想情况下,我应该能够在这里找到:

| 1820187      | 2011-01-21 21:55:11     | 2.312     |
| 1820186      | 2011-01-21 21:54:00     | 2.313     |
| 1820185      | 2011-01-20 17:46:10     | 1.755     |
| 1820184      | 2011-01-20 17:45:05     | 1.785     |

如果你有任何想法,我在这里很迷茫。

4

2 回答 2

1

让我们以一种微妙的方式重述您的问题,以便我们可以在宇宙热死之前完成这个查询。

“我需要知道表中的连续记录,其时间戳之间的距离小于两分钟。”

我们可以将“连续”的概念与您的 id 值联系起来。

试试这个查询,看看你是否获得了不错的性能(http://sqlfiddle.com/#!9/28738/2/0

SELECT a.date first_date, a.id first_id, a.value first_value,
       b.id second_id, b.value second_value,
       TIMESTAMPDIFF(SECOND, a.date, b.date) delta_t
  FROM thetable AS a
  JOIN thetable AS b  ON b.id = a.id + 1 
                     AND b.date <= a.date + INTERVAL 2 MINUTE

自联接工作负载与ON b.id = a.id + 1. 而且,避免对两个date列值之一使用函数允许查询利用该列上可用的任何索引。

创建覆盖索引(id,date,value)将有助于此查询的性能。

如果连续行假设在此数据集中不起作用,您可以尝试这样做,将每一行与接下来的十行进行比较。它会更慢。( http://sqlfiddle.com/#!9/28738/6/0 )

SELECT a.date first_date, a.id first_id, a.value first_value,
       b.id second_id, b.value second_value,
       TIMESTAMPDIFF(SECOND, a.date, b.date) delta_t
  FROM thetable AS a
  JOIN thetable AS b  ON b.id <= a.id + 10
                     AND b.id >  a.id 
                     AND b.date <= a.date + INTERVAL 2 MINUTE

如果这些id值作为排序行的一种方式完全没有价值,那么您将需要它。而且,它会很慢。( http://sqlfiddle.com/#!9/28738/5/0 )

SELECT a.date first_date, a.id first_id, a.value first_value,
       b.id second_id, b.value second_value,
       TIMESTAMPDIFF(SECOND, a.date, b.date) delta_t
  FROM thetable AS a
  JOIN thetable AS b  ON b.date <= a.date + INTERVAL 2 MINUTE
                     AND b.date >  a.date
                     AND b.id <> a.id
于 2015-08-31T15:44:35.360 回答
0

对表格做一个SELF JOIN并使用TIMEDIFF()类似的功能

SELECT t1.* 
from ACQUISITION t1 JOIN ACQUISITION t2
ON TIMEDIFF(t1.`date`, t2.`date`) <= 2;
于 2015-08-31T14:47:53.373 回答