ToB企服应用市场:ToB评测及商务社交产业平台

标题: SQL去重的四种方法 [打印本页]

作者: 天空闲话    时间: 2024-8-21 18:56
标题: SQL去重的四种方法
去重是指:查询的时间, 不显示重复,并不是删除表中的重复项
数据表:

方法1:distinct去重
作用:只能一列去重,当distinct后跟大于1个参数时,他们之间的关系是&&(逻辑与)关系,只有全部条件相同才会去重
弊端:当查询的字段比较多时,distinct会作用多个字段,导致去重条件增多
代码:
  1. select distinct UserResult from Table1
复制代码

方法2:group by去重
作用:将重复的行进行分组,相同的数据只显示第一行
弊端:使用group by后,全部查询字段都需要使用聚合函数,比较繁琐
留意点:这样去除之后的数据是保存的第一条重复的数据,如果想保存最后一条数据,将min()改成max(),此为,如果存在null的情况,如果获取最后一条数据中有空字段时,如果想拿空值,数据库会自动拿上一个值添补空值
代码:
  1. select  min(UserName)UserName,min(UserSex)UserSex,min(UserSubject)UserSubject,min(UserResult)UserResult from Table1
  2. group by UserResult
复制代码

方法3:使用函数:row_number() over (parttion by 分组列 order by 排序列)
作用:先根据重复列进行分组,分组后再进行排序,不同的组序号为1,相同的组序号为2,排除为2的就到达了去重结果
缺点:需要8.0以上的数据库才气支持写法
代码:
  1. select *from
  2. (
  3. --查询出重复行
  4. select *,row_number() over (partition by UserResult order by UserResult desc)num from Table1
  5. )A
  6. where A.num=1
复制代码

方法4:方法3的进阶
代码:一张表a,开始时间是b,用户姓名c
  1. select a.* from a join(select c, max(b) as max b from a group by c ) b
  2. on a.c = b.c and
  3. a.b = b.max b
复制代码
原理:先根据要去重的字段姓名,和唯一字段时间,拿到最后一个值,然后根据这个值,作为链接查询的关系,自连,从而完成拿到最后一条数据
5.删除重复数据,只保存一条数据的写法:
Oracle数据库的写法:
  1. DELETE
  2. FROM
  3.         dept
  4. WHERE
  5.         dname IN ( SELECT dname FROM dept GROUP BY dname HAVING count( dname ) > 1 ) -- 过滤出重复的dname
  6.         AND deptno NOT IN ( SELECT min( deptno ) AS deptno FROM dept GROUP BY dname HAVING count( dname ) > 1 ) --
复制代码
过滤出不在需要保存的id之外的全部id
MySQL数据库:
  1. DELETE
  2. FROM
  3.         dept
  4. WHERE
  5.         dname IN ( SELECT * FROM ( SELECT dname FROM dept GROUP BY dname HAVING count( dname ) > 1 ) a )
  6.         AND deptno NOT IN ( SELECT * FROM ( SELECT min( deptno ) AS deptno FROM dept GROUP BY dname HAVING count( dname ) > 1 ) b )
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4