2013-03-26 169 views
0

我一直在尋找幾個小時來找到這個記錄,雖然有很多變化,但我似乎無法完全按照我的具體要求關閉循環....每次我想我已經把它從我身邊溜走:)MYSQL將多條記錄中的記錄除外最新記錄

所以這裏是它;

我已經將一堆記錄導入到最終唯一行但具有某些列中某些重複數據的表中。 我想記錄拆分到兩個表 - 一個表有自己的「代碼」組中的最新時間戳DISTINCT或獨特的「代碼」的記錄,一個表中的記錄,其餘

[編輯 - 最誠摯的歉意,我不得不改變,因爲我不認爲我第一次清楚表達 - 事實上,我得到了它非常錯誤...對不起!]

我有多列只有獨特的ROWS - (即每列都有重複的數據,但特定行中所有列的組合是唯一的 - 顯然不包括主鍵)

我需要的是t他的行包含最新時間戳對於代碼在特定的area_id內。
在下面的例子中,我已經排除了其他列,因爲我將這三個視爲鍵;

TABLE#1 
     code area_id timestamp  
     1  2  2010-02-31 00:00:00 
     2  2  2012-01-31 00:00:00 
     2  2  2011-02-31 00:00:00 
     1  5  2010-02-31 00:00:00 
     2  5  2010-02-31 00:00:00 
     1  2  2011-01-31 00:00:00 
     1  5  2012-01-31 00:00:00 

所以我試圖說的答案的結構是;

「對於代碼 &組合AREA_ID ,最新的時間戳2011-01-31 00:00:00」 - 返回該行。

對代碼和area_id的每個組合重複。

so;

RESULT 
     code area_id timestamp  
     1  2  2011-01-31 00:00:00 
     2  2  2012-01-31 00:00:00 
     1  5  2012-01-31 00:00:00 
     2  5  2010-02-31 00:00:00 

正如我所說,有相當需要附帶的數據時,我分裂行出數等欄目,但我認爲,以後我可以不用擔心 - 第一步是獲取數據沒有mysql/workbench的結果集超時了!

JS

回答

0

這是表2

INSERT INTO Table2 
SELECT * 
FROM Table1 
WHERE (code, timestamp) NOT IN (SELECT code, MAX(timestamp) 
           FROM Table1 
           GROUP BY code) 

,然後將此刪除記錄從表1:

DELETE FROM Table1 
WHERE (code, timestamp) NOT IN (SELECT * FROM (SELECT code, MAX(timestamp) 
           FROM yourtable 
           GROUP BY code) s) 

請參閱小提琴here(我改變了2月31日至28日,和4月31日至30日,我認爲這是一個錯字)。

編輯

由於這些查詢執行速度太慢,你可以嘗試JOIN版本:

INSERT INTO Table2 
SELECT t1.* 
FROM Table1 t1 LEFT JOIN (SELECT code, MAX(timestamp) max_timestamp 
          FROM Table1 
          GROUP BY code) t2 
    ON t1.code=t2.code and t1.timestamp=t2.max_timestamp 
WHERE 
    t2.code IS NULL; 

DELETE t1 
FROM Table1 t1 LEFT JOIN (SELECT code, MAX(timestamp) max_timestamp 
          FROM Table1 
          GROUP BY code) t2 
    ON t1.code=t2.code and t1.timestamp=t2.max_timestamp 
WHERE 
    t2.code IS NULL; 

請參閱小提琴here

此外,您還可以嘗試添加更多的下列指標之一:

CREATE INDEX idx1 ON Table1 (code) 
CREATE INDEX idx2 ON Table1 (timestamp) 
CREATE INDEX idx3 ON Table1 (code,timestamp) 
+0

錯誤代碼:查詢\t 600.532秒期間2013年失去與MySQL服務器...><大約只有500K在表中的行...再試一次! – user2213361 2013-03-26 22:05:28

+0

@ user2213361第一個還是第二個?你有沒有索引?我可以使用JOIN使它們更快一點 – fthiella 2013-03-26 22:06:57

+0

我在這裏使用的表僅僅是爲了解釋 - 我應該可能包括我的實際表格,但是有很多列......我的Table1有一個AI PK列和當我複製表結構到Table2我猜測,試圖用Table1中的值填充Table2 AI PK可能會導致對數據庫的一些混淆...我已經刪除了Table2 PK列並專門選擇了所有在SELECT語句中使用Table1的列而不是使用* ....再次忙於運行... – user2213361 2013-03-27 05:09:37