sql中查重和去重

在这记录一个实习期间遇到的一个查重和去重的sql语句。

查重语句:(group by 查重)

SELECT user_id,
            count(*) as num

FROM 表名

WHERE 条件  GROUP BY user_id HAVING count(*)>1;

sql语句关键词为大写,基本思路就是以user_id字段来进行分组排序,count(*)函数是计数,这语句结果图如下

user_id num
xiaoming 2
xiaoyu 3

上面所展示出来的都是有user_id重复的数据,user_id为xiaoming的字段有2条重复记录,xiaoyu存在3条重复,因为如果没有重复的话count(*)也就是表中的num值应该为1。

去重语句:(row_number over()去重)

select user_id,
 create_date,
 row_number() over(partition by user_id order by create_date desc) as date_n 
FROM 表名 
WHERE date_n=1                 

AND 条件;  

扫描二维码关注公众号,回复: 2053459 查看本文章

这里的去重就是利用了上述中的没有重复的count(*)为1,所以我们只需要取出1就可以了,但是问题在于,重复的字段中取出哪个去除哪个,还有就是把重复中要取出的count(*)值为1,这里我们要用到的就是排序函数,row_number() over(partition by order by)函数的具体可以自行百度,上诉实例中,总结就是按user_id分组,按create_date排序,desc这个是设置降序和升序的作用,通过row_number函数处理的大体效果:

user_id creat_date date_n
xiaoming 2018-05-06 1
xiaoming 2018-02-03 2
xiaoyu 2018-06-01 1
xiaoyu 2018-05-20 2
xiaoyu 2018-05-10 3

这就是达到了我们想取到1的目的。主要就是我们要清楚要根据什么来排序,这个字段意义在于通过其可以判断在同一user_id中的不同点。我们只要在where 条件中限制date_n=1即可去重。

结果图如下:

user_id creat_date date_n
xiaoming 2018-05-06 1
xiaoyu 2018-06-01 1

猜你喜欢

转载自blog.csdn.net/weixin_42382211/article/details/80773936