常用sql:删除表中重复的数据

        在平常的开发工作中,我们可能经常需要对表进行操作。比如某些数据重复了,那么可能需要删除掉重复的数据,保证数据根据业务字段属性相同的数据只有一条,那么应该如何做呢?

        1:新建表:用户详情表

create table user_details (
   id BIGINT not null auto_increment comment '主键',
	 name varchar(20) default null COMMENT '用户名',
	 create_time datetime default null comment '创建时间',
	 primary key (id)
);

         2:插入测试数据:

INSERT INTO `mysql`.`user_details`(`id`, `name`, `create_time`) VALUES (1, '小明', '2024-07-27 18:33:01');
INSERT INTO `mysql`.`user_details`(`id`, `name`, `create_time`) VALUES (2, '小花', '2024-07-27 18:33:45');
INSERT INTO `mysql`.`user_details`(`id`, `name`, `create_time`) VALUES (3, '小王', '2024-07-27 18:34:01');
INSERT INTO `mysql`.`user_details`(`id`, `name`, `create_time`) VALUES (4, '小明', '2024-07-27 18:34:13');
INSERT INTO `mysql`.`user_details`(`id`, `name`, `create_time`) VALUES (5, '小花', '2024-07-27 18:34:27');

        3:使用 partition  by  分区函数:根据名字将数据分区,然后将数据排序,每个分组中数据序号不是1的删除,即当前分组数据超过一条:

        1)先看表中当前数据:可以看出小明和小花的数据各有两条:

          

        2)根据分区函数删除重复数据:

delete from user_details where id in (

with userInfo as (
		select ud.name, 
		ud.id,
		RANK() over (partition by name order by id asc) as serialNumber
		from user_details ud
)
select
	id
 from userInfo where serialNumber != 1)

        3)删除后重新查看数据:

        

        4:使用 having count() 筛选出 超过一条的数据,然后进行删除:

        1)先进行数据过滤,然后id关联,删除掉name相同,但是id大的数据,sql如下:

DELETE t1 FROM user_details t1
INNER JOIN (
    SELECT name, MIN(id) AS minId
    FROM user_details
    GROUP BY name
    HAVING COUNT(*) > 1
) t2 ON t1.name = t2.name AND t1.id > t2.minId;

        2)删除后重新查询:

        以上为常见重复数据的删除方式,因为筛选出重复数据后,需要保留重复数据中的一条,以上为常用的两种方式。美好的风景一直在路上,加油 !

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值