由于一些错误,我们在表中有重复的用户条目,我想创建一个临时表,其中包含除最新记录之外的所有行
id name unique_id created_at ----------------------------------------- 1 aaaa 1 2018-01-20 13:40:30 2 aaaa 1 2017-01-20 13:40:30 3 aaaa 1 2016-01-20 13:40:30 4 bbbb 2 2018-01-20 13:40:30 5 bbbb 2 2017-01-20 13:40:30 6 bbbb 2 2016-01-20 13:40:30 7 cccc 3 2018-01-20 13:40:30 8 cccc 3 2017-01-20 13:40:30 9 cccc 3 2016-01-20 13:40:30
获取以下结果的查询是什么,以便我可以将其存储在另一个表
中id name unique_id created_at ---------------------------------------- 2 aaaa 1 2017-01-20 13:40:30 3 aaaa 1 2016-01-20 13:40:30 5 bbbb 2 2017-01-20 13:40:30 6 bbbb 2 2016-01-20 13:40:30 8 cccc 3 2017-01-20 13:40:30 9 cccc 3 2016-01-20 13:40:30
答案 0 :(得分:0)
DELETE FROM user WHERE id IN (SELECT id, MAX(created_at) from user GROUP BY unique_id)
答案 1 :(得分:0)
您似乎要求:
create temporary table t as
select u.*
from users u
where u.id < (select max(u2.id) from users u2 where u2.unique_id = u.unique_id);
如果性能问题,您需要users(unique_id, id)
上的索引。
答案 2 :(得分:0)
由于我有数百万条记录,我使用3个临时表做了类似的事情
- 获得个人组中的所有最大值
create temporary table max_value_table as select id,unique_id from users c inner join (select max(created_at)as date1, unique_id as pi from users group by unique_id having count(*) > 1) d on c.created_at = d.date1;
- 与原始(用户)表连接只获取重复记录(忽略单次出现的ID)
create temporary table duplicate_value_table as select c.id,name,c.unique_id,c.created_at from users c inner join max_value_table t on c.unique_id = t.unique_id;
- 使用tamp连接duplicate_value_table表并将其存储在result_table
中create temporary table result_table as select t2.id,name,t2.unique_id,t2.created_at from duplicate_value_table t2 inner join max_value_table t1 on t1.unique_id = t2.unique_id and t2.id != t1.id;
现在,result_table具有以后可以删除的所有值。