SQL去重的四种方法

时间:2024-07-18 14:07:54

去重是指:查询的时候, 不显示重复,并不是删除表中的重复项
数据表:
在这里插入图片描述
方法1:distinct去重
作用:只能一列去重,当distinct后跟大于1个参数时,他们之间的关系是&&(逻辑与)关系,只有全部条件相同才会去重
弊端:当查询的字段比较多时,distinct会作用多个字段,导致去重条件增多
代码:

select distinct UserResult from Table1

在这里插入图片描述
方法2:group by去重
作用:将重复的行进行分组,相同的数据只显示第一行
弊端:使用group by后,所有查询字段都需要使用聚合函数,比较繁琐
注意点:这样去除之后的数据是保留的第一条重复的数据,如果想保留最后一条数据,将min()改成max(),此为,如果存在null的情况,如果获取最后一条数据中有空字段时,如果想拿空值,数据库会自动拿上一个值填充空值
代码:

select  min(UserName)UserName,min(UserSex)UserSex,min(UserSubject)UserSubject,min(UserResult)UserResult from Table1
group by UserResult

在这里插入图片描述

方法3:使用函数:row_number() over (parttion by 分组列 order by 排序列)
作用:先根据重复列进行分组,分组后再进行排序,不同的组序号为1,相同的组序号为2,排除为2的就达到了去重效果
缺点:需要8.0以上的数据库才能支持写法
代码:

select *from
(
--查询出重复行
select *,row_number() over (partition by UserResult order by UserResult desc)num from Table1
)A
where A.num=1

在这里插入图片描述
方法4:方法3的进阶
代码:一张表a,开始时间是b,用户姓名c

select a.* from a join(select c, max(b) as max b from a group by c ) b
on a.c = b.c and
a.b = b.max b

原理:先根据要去重的字段姓名,和唯一字段时间,拿到最后一个值,然后根据这个值,作为链接查询的关系,自连,从而完成拿到最后一条数据

5.删除重复数据,只保留一条数据的写法:
Oracle数据库的写法:

DELETE 
FROM
	dept 
WHERE
	dname IN ( SELECT dname FROM dept GROUP BY dname HAVING count( dname ) > 1 ) -- 过滤出重复的dname
	AND deptno NOT IN ( SELECT min( deptno ) AS deptno FROM dept GROUP BY dname HAVING count( dname ) > 1 ) -- 

过滤出不在需要保留的id之外的所有id

MySQL数据库:

DELETE 
FROM
	dept 
WHERE
	dname IN ( SELECT * FROM ( SELECT dname FROM dept GROUP BY dname HAVING count( dname ) > 1 ) a ) 
	AND deptno NOT IN ( SELECT * FROM ( SELECT min( deptno ) AS deptno FROM dept GROUP BY dname HAVING count( dname ) > 1 ) b )