SQL中去除重复数据的几种方法汇总(窗口函数对数据去重)(sql去掉重复的)学会了吗

随心笔谈2年前发布 admin
188 0 0

文章摘要

这篇文章介绍了SQL中去除重复数据的三种主要方法:`distinct`、`group by` 和 窗口函数。通过具体案例分析,解释了每种方法的使用场景和特点。 1. **`distinct` 方法**:用于对单字段或多个字段进行去重,需要注意的是,多字段去重会将多个字段作为一个整体处理,可能导致重复记录的减少不完全。 2. **`group by` 方法**:通过分组对数据进行去重,减少表中的行数,但每组只保留一个记录。这种方法适用于需要聚合数据的场景。 3. **窗口函数**:通过排序和分组对数据进行动态去重,不会减少原表的行数,而是按照排序结果筛选出符合条件的记录。文章以`row_number()`函数为例,展示了如何根据浏览时长对数据排序,并筛选出每次访客对应的最早或最新记录。 文章总结了这三种方法的适用场景,并提醒读者根据具体需求选择合适的方法。最后建议读者在评论区补充其他去重方法,以丰富内容。



目录方法1:distinct方法2:group by方法3:窗口函数

使用SQL对数据进行提取和分析时,我们经常会遇到数据重复的场景,需要我们对数据进行去重后分析。

以某电商公司的销售报表为例,常见的去重方法我们用到distinct 或者group by 语句, 今天介绍一种新的方法,利用窗口函数对数据去重。

【字段解释】

访客id:进入店铺浏览宝贝的客户

浏览时间:访客进入店铺浏览页面的日期

浏览时常:访客进入店铺浏览页面的时长

现在需要知道店铺里每个访客和对应的浏览日期(每个访客同一天浏览多次算做一次记录)

【解题思路】

SQL书写如下:

select distinct 访客id ,浏览时间
from 淘宝日销售数据表;

查询结果:

这里用distinct语句多字段进行去重的时候,需要特别注意2点:

1)distinct语法规定对单字段、多字段去重,必须放在第一个查询字段前。

2)如果对表中多列字段进行去重,去重的过程就是将多字段作为整体去重,比如上面的例子,我们将访客id和浏览时间为整体去去重,而不是对访客id单独去重后再对姓名单独去重,所以会出现相同的访客id对应不同的浏览时间。

SQL书写如下:

select 访客id ,浏览时间
from 淘宝日销售数据表
group by 访客id ,浏览时间;

查询结果:

group by对访客id 和浏览时间进行分组,分组汇总后改变了表的行数,一行只有一个类别,这里使用group by后会将访客id 和浏览时间作为一个类别保留,重复的就会不显示。

使用窗口函数进行去重时,比distinct和group by稍微复杂些,窗口函数不会减少原表中的行数,而是对字段进行分组后排序。详细的窗口函数讲解

窗口函数的基本语法如下:

<窗口函数> 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了吗?欢迎评论区补充你的去重办法~

到此这篇关于SQL中去除重复数据的几种方法,我一次性都告你?的文章就介绍到这了,更多相关sql去除重复数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:mysql优化小技巧之去除重复项实现方法分析【百万级数据】MySQL 去除重复数据实例详解详解mysql数据去重的三种方式

© 版权声明

相关文章