2015-08-31 116 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

是的,它進行了許多比較。下週見:-) –

相關問題