从每个组获取除max value以外的所有项-mysql

brgchamk  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(534)

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

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
tag5nh1u

tag5nh1u1#

DELETE FROM user WHERE id IN (SELECT id, MAX(created_at) from user GROUP BY unique_id)

fivyi3re

fivyi3re2#

因为我有数百万条记录,所以我做了类似的事情,使用了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;

--join with original(users)表只获取重复记录(忽略单个事件的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连接重复的\u值\u表并将其存储在结果\u表中

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\表中包含了所有可以稍后删除的值。

js81xvg6

js81xvg63#

你似乎在要求:

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) .

相关问题