从每个组中获取除最大值之外的所有项目 - mysql

时间:2018-06-13 17:59:19

标签: mysql sql

由于一些错误,我们在表中有重复的用户条目,我想创建一个临时表,其中包含除最新记录之外的所有行

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

3 个答案:

答案 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具有以后可以删除的所有值。