除了多个重复的最新记录外,MYSQL分割出记录

时间:2013-03-26 21:33:15

标签: mysql split timestamp duplicates

我一直在找几个小时来找到这个,虽然有很多变化我似乎无法完全按照我的具体要求关闭循环....每次我认为我已经得到它滑倒远离我:)

所以在这里;

我已经将一堆记录导入到一个表中,该表最终具有唯一的行,但在某些列中有一些重复的数据。 我想将记录分成两个表 - 一个表带有DISTINCT或UNIQUE'代码'记录,其中包含“代码”组中的最新时间戳,另一个表带有其余记录 < / p>

[编辑 - 真诚的道歉,我不得不改写,因为我认为我第一次没有清楚地表达出来 - 实际上我弄错了...抱歉!]

我有多个列只有唯一的ROWS - (即每列都有重复数据,但特定行中所有列的组合是唯一的 - 显然不包括主键)

我需要的是包含特定 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

所以我试图用短语的答案的结构是;

“对于代码 1 &amp; area_id 2 的组合,最新时间戳为 2011-01-31 00:00:00” - 返回那一行。

对代码和area_id的每个组合重复。

如此;

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

1 个答案:

答案 0 :(得分:0)

这适用于table2

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

然后这将删除Table1中的记录:

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)