关于数据去重
第一种场景,每行数据所有列的值都是重复的,如以下情景,
id 名称 编码 1 haha 001 1 haha 001 2 lala 001 2 lala 001
那么处理以上情景,则很简单,可以创建一个和原表结构相同的新表,直接使用distinct关键字将去重后的数据放到新表中
insert into 新表 select distinct * from 旧表
但是以上场景并不多见,更多见的是这种场景,id主键不同,但是名称和编码相同,如下
id 名称 编码 1 haha 001 2 haha 001 3 lala 001 4 lala 001 2 haha 001 4 lala 001
这个时候如何解决呢,则要使用分组聚合的方式,按照重复的字段进行分组,具体方案如下
#假设有这样一张表,表中的数据id不重复,但是t_name,t_price有重复,我们的问题是,这两列重复的数据只能留一行 create table test_group(t_id int,t_name varchar(20),t_price float ) insert into test_group values(7,'橘子',8), (2,'葡萄',10), (3,'橘子',8), (4,'橘子',8), (5,'香蕉',9), (6,'葡萄',10) #以下sql是按照t_name,t_price分组,分组后,每组查询出最大的id或者最小的id,也就是说,每组只留一个id select max(t_id) from test_group group by t_name,t_price #接下来,将表中不在最大id或者最小id中的哪些数据行删除即可 delete from test_group where t_id not in( select * from ( select max(t_id) from test_group group by t_name) as t )
接下来,还有一种场景,就是百万级数据去重,其他条件和第二种场景一样,哪怎么办,具体的方案就是
1.先对去重的表中的重复字段上建立索引,为了提高待会分组统计的效率如在 t_name,t_price建立索引 2.建立一个和原表结构相同的新表 3.将原表中的数据去重后直接放到新表中,以下命令保证了,查询旧表数据的时候,重复的数据只能留一行 insert into 新表 select * from 旧表 group by 重复字段 limit 1000000 4.以上命令多执行几次