SQL中去除重复数据的几种方法,我一次性都告诉你 | 您所在的位置:网站首页 › select消除重复记录的方法 › SQL中去除重复数据的几种方法,我一次性都告诉你 |
使用SQL对数据进行提取和分析时,我们经常会遇到数据重复的场景,需要我们对数据进行去重后分析。 以某电商公司的销售报表为例,常见的去重方法我们用到distinct 或者group by 语句, 今天介绍一种新的方法,利用窗口函数对数据去重。 【字段解释】 访客id:进入店铺浏览宝贝的客户 浏览时间:访客进入店铺浏览页面的日期 浏览时常:访客进入店铺浏览页面的时长 现在需要知道店铺里每个访客和对应的浏览日期(每个访客同一天浏览多次算做一次记录) 【解题思路】 方法1:distinct SQL书写如下: select distinct 访客id ,浏览时间 from 淘宝日销售数据表;查询结果: 这里用distinct语句多字段进行去重的时候,需要特别注意2点: 1)distinct语法规定对单字段、多字段去重,必须放在第一个查询字段前。 2)如果对表中多列字段进行去重,去重的过程就是将多字段作为整体去重,比如上面的例子,我们将访客id和浏览时间为整体去去重,而不是对访客id单独去重后再对姓名单独去重,所以会出现相同的访客id对应不同的浏览时间。 方法2:group by SQL书写如下: select 访客id ,浏览时间 from 淘宝日销售数据表 group by 访客id ,浏览时间;查询结果: group by对访客id 和浏览时间进行分组,分组汇总后改变了表的行数,一行只有一个类别,这里使用group by后会将访客id 和浏览时间作为一个类别保留,重复的就会不显示。 方法3:窗口函数 使用窗口函数进行去重时,比distinct和group by稍微复杂些,窗口函数不会减少原表中的行数,而是对字段进行分组后排序。详细的窗口函数讲解(请点击-通俗易懂的学会:SQL窗口函数) 窗口函数的基本语法如下: over (partition by order by )根据题目要求得出每个访客和对应的浏览日期,我们对访客id ,浏览时间进行分组,对浏览时长(秒)进行排序。 SQL书写如下: select 访客id ,浏览时间 ,row_number()over(partition by 访客id ,浏览时间 order by 浏览时长(秒)) as 排名 from 淘宝日销售数据表;查询结果: 窗口函数查询按照每个客户和浏览日期分组,如果同一天有几次浏览,会根据点赞数排序,筛选排名为1,即可得出每个访客和对应的浏览日期。 SQL书写如下: select 访客id ,浏览时间 ,row_number()over(partition by 访客id ,浏览时间 order by 浏览时长(秒)) as 排名 from 淘宝日销售数据表;查询结果: 去除重复项的三种操作,你get了吗?欢迎评论区补充你的去重办法~ ⬇️点击「阅读原文」 免费报名 数据分析训练营 |
CopyRight 2018-2019 实验室设备网 版权所有 |