2013-03-26 132 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