我正在尝试从没有主键的表中删除重复项。表的结构如下所示:
|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技能有限,实际上几乎不存在。我一直在阅读和搜索一段时间,我没有到达那里......
我尝试了不同的方法(临时表,选择内连接)
任何帮助都会有很大帮助。
答案 0 :(得分:1)
保留临时表中所需的所有行:
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
然后从yourtable中删除行
要完成,请将临时表中的行插入到yourtable