0

我一直在寻找几个小时来找到这个,虽然有很多变化,但我似乎无法完全满足我的特定要求......每次我认为我已经得到它时,它都会从我身边溜走:)

就是这样;

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

[编辑 - 最诚挚的歉意,我必须重新措辞,因为我认为我第一次表达的不是很清楚 - 事实上我弄错了......对不起!]

我有多个仅具有唯一 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

所以我试图表达的答案的结构是;

“对于 code 1 & 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/ 的情况下获取结果集中的数据工作台超时!

JS

4

1 回答 1

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)

在此处查看小提琴(我将 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;

在此处查看小提琴。

此外,您可以尝试添加以下索引之一:

CREATE INDEX idx1 ON Table1 (code)
CREATE INDEX idx2 ON Table1 (timestamp)
CREATE INDEX idx3 ON Table1 (code,timestamp)
于 2013-03-26T21:42:38.990 回答