在数据库中,重复数据与查重是经常遇到并且需要解决的问题。在现在所做的工作中,经常会遇到需要去重的情况。今天在这里进行一下汇总。
1.distinct
在刚开始接触数据库时大家应该都会在书中接触到 distinct 关键字。distinct作为一个专门设计用来驱虫的关键字往往在真正的工作中不经常使用。一是因为用distinct关键字只能过滤查询字段中所有记录相同的。二是因为distinct的效率较低。用法举例:
select distinct name from t1 ;--能消除重复记录,但只能取一个字段,现在要同时取id,name这2个字段的值
select distinct id,name from t1;-- 可以取多个字段,但只能消除这2个字段值全部相同的记录
2.group by
删除表中重复的数据
在生产环境中肯定不能随便删除的,那么使用分组嵌套也会显得很麻烦,在这里推荐我个人常用的去重方法
3.RANK() OVER() PARTITION BY
使用这几个函数的最大优点是思路清晰。举个例子,某公司员工信息不做删除,一个员工先跳槽到其他公司,人后再跳槽回到平本公司,就可能导致不止一条员工信息。二通过身份证号码查到的员工信息应该有且仅有一条。可以这样来写sql语句:
SELECT * FROM
(SELECT RANK() OVER(PARTITION BY 身份证号码 ORDER BY 最后更新时间 DESC) RK,t.*
FROM emp) T WHERE T.RK>1
partition by后面接唯一标示,order by 后面接去重条件。通过这样写sql,可以先将查询出的结果排序,rk为自定义的排序列,将排在第一个结果取出来。
这里注意rank()函数也可以换成使用row_number(),两者的区别 ,在rk在某些情况下回出现并列的情况(去重条件没选好会有这种情况)。二使用row_number()是不会的。也就是说使用rank的排序是预许存在并列名词的情况。而使用row_number的排序不允许存在并列的情况。
在个人在生产环境中常用第三种,比较好用思路也很清晰。在这里与大家分享一下。