2015-08-31 117 views
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  | 

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

回答

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 
+0

这看起来特别是连续的行 - 这意味着对数据做两个假设(但我认为只有其中一个是合理的) – Strawberry

+0

正是我在找的!感谢您的时间和您的解释Ollie,我使用第一个查询在几分钟内删除253 000个重复数据! – kesm0

0

做一个SELF JOIN与该表使用TIMEDIFF()之类的函数

SELECT t1.* 
from ACQUISITION t1 JOIN ACQUISITION t2 
ON TIMEDIFF(t1.`date`, t2.`date`) <= 2; 
+0

是结果正确吗? http://sqlfiddle.com/#!9/a1f90/1 – splash58

+0

我是wainting ...做了这个查询使1 720 208^1 720 208请求? – kesm0

+1

是的,它进行了许多比较。下周见:-) –

相关问题