关于数据去重

第一种场景,每行数据所有列的值都是重复的,如以下情景,

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.以上命令多执行几次
  • 11
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值