我一直在找几个小时来找到这个,虽然有很多变化我似乎无法完全按照我的具体要求关闭循环....每次我认为我已经得到它滑倒远离我:)
所以在这里;
我已经将一堆记录导入到一个表中,该表最终具有唯一的行,但在某些列中有一些重复的数据。
我想将记录分成两个表 - 一个表带有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
答案 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)