在这记录一个实习期间遇到的一个查重和去重的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 条件;
这里的去重就是利用了上述中的没有重复的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 |