在平常的开发工作中,我们可能经常需要对表进行操作。比如某些数据重复了,那么可能需要删除掉重复的数据,保证数据根据业务字段属性相同的数据只有一条,那么应该如何做呢?
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)删除后重新查询:
以上为常见重复数据的删除方式,因为筛选出重复数据后,需要保留重复数据中的一条,以上为常用的两种方式。美好的风景一直在路上,加油 !