0

我正在尝试从没有主键的表中删除重复项。表的结构如下所示:

|cID|changeDate|changeTime|operator|
|001|01.01.2005|12:00:00  |a       |
|001|01.01.2005|12:00:00  |null    |
|002|01.01.2005|12:00:00  |a       |
|002|01.02.2005|12:00:00  |a       |
|002|01.02.2005|12:45:00  |a       |
|003|01.01.2005|12:00:00  |a       |
|003|01.01.2005|12:00:00  |a       |
|003|01.02.2005|12:00:00  |a       |
|003|01.03.2005|12:00:00  |a       |
|003|01.03.2005|12:00:00  |null    |

我想要实现的是:检查重复的“cID”,保留在“changeDate”中具有最新日期的那个。如果两条记录具有相同的“changeDate”,则保留具有最新“changeTime”的记录。如果仍然存在重复,则在此结果中保留“操作员”中不为空的结果。

上表应如下所示:

|cID|changeDate|changeTime|operator|
|001|01.01.2005|12:00:00  |a       |
|002|01.02.2005|12:45:00  |a       |
|003|01.03.2005|12:00:00  |a       |

DB是mysql,引擎是innodb。我想在不创建新表的情况下实现这一点。

我的sql技能有限,实际上几乎不存在。我一直在阅读和搜索一段时间,但我没有到达那里......

我尝试了不同的方法(临时表,使用内部连接选择)

任何帮助将不胜感激。

4

1 回答 1

1

SQLfiddle 演示

在临时表中保留您需要的所有行:

SELECT t.* 
FROM (
SELECT ( 
    CASE cid 
    WHEN @curCId 
    THEN @curRow := @curRow + 1 
    ELSE @curRow := 1 AND @curCId := cid END
  ) AS rank,
  p.*
FROM      mytable p,(SELECT @curRow := 0, @curCId := '') r
ORDER BY cid,changedate desc,changetime desc,operator desc
) t
where rank =1

然后从你的表中删除行

最后,将临时表中的行插入到您的表中

于 2013-11-07T16:04:38.487 回答