SQL中去除重复数据的几种方法汇总(窗口函数对数据去重)


Posted in MySQL onMay 08, 2023

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

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

SQL中去除重复数据的几种方法汇总(窗口函数对数据去重)

【字段解释】

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

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

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

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

【解题思路】

方法1:distinct

SQL书写如下:

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

查询结果:

SQL中去除重复数据的几种方法汇总(窗口函数对数据去重)

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

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

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

方法2:group by

SQL书写如下:

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

查询结果:

SQL中去除重复数据的几种方法汇总(窗口函数对数据去重)

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

方法3:窗口函数

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

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

<窗口函数> over (partition by <用于分组的列名>
                order by <用于排序的列名>)

根据题目要求得出每个访客和对应的浏览日期,我们对访客id ,浏览时间进行分组,对浏览时长(秒)进行排序。

SQL书写如下:

select 访客id ,浏览时间 ,row_number()over(partition by 访客id ,浏览时间
order by 浏览时长(秒)) as 排名
     from 淘宝日销售数据表;

查询结果:

SQL中去除重复数据的几种方法汇总(窗口函数对数据去重)

窗口函数查询按照每个客户和浏览日期分组,如果同一天有几次浏览,会根据点赞数排序,筛选排名为1,即可得出每个访客和对应的浏览日期。

SQL书写如下:

select 访客id ,浏览时间 ,row_number()over(partition by 访客id ,浏览时间
order by 浏览时长(秒)) as 排名
     from 淘宝日销售数据表;

查询结果:

SQL中去除重复数据的几种方法汇总(窗口函数对数据去重)

去除重复项的三种操作,你get了吗?欢迎评论区补充你的去重办法~

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

MySQL 相关文章推荐
MySQL 可扩展设计的基本原则
May 14 MySQL
.Net Core导入千万级数据至Mysql的步骤
May 24 MySQL
如何自己动手写SQL执行引擎
Jun 02 MySQL
MySQL GRANT用户授权的实现
Jun 18 MySQL
SQL实现LeetCode(178.分数排行)
Aug 04 MySQL
分析MySQL优化 index merge 后引起的死锁
Apr 19 MySQL
MySQL数据库Innodb 引擎实现mvcc锁
May 06 MySQL
MySQL 计算连续登录天数
May 11 MySQL
Mysql数据库事务的脏读幻读及不可重复读详解
May 30 MySQL
MySQL中JOIN连接的基本用法实例
Jun 05 MySQL
mysql通过group by分组取最大时间对应数据的两种有效方法
Sep 23 MySQL
MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
May 08 MySQL
MySQL中TIMESTAMP类型返回日期时间数据中带有T的解决
Dec 24 #MySQL
MySQL实现用逗号进行拼接、以逗号进行分割
Dec 24 #MySQL
MySQL数据管理操作示例讲解
Dec 24 #MySQL
MySQL深分页问题解决思路
Dec 24 #MySQL
DQL数据查询语句使用示例
Dec 24 #MySQL
mysql数据库如何转移到oracle
Dec 24 #MySQL
mysql序号rownum行号实现方式
Dec 24 #MySQL
You might like
用定制的PHP应用程序来获取Web服务器的状态信息
2006/10/09 PHP
解析使用substr截取UTF-8中文字符串出现乱码的问题
2013/06/20 PHP
php生成图片验证码的实例讲解
2015/08/03 PHP
最新版本PHP 7 vs HHVM 多角度比较
2016/02/14 PHP
PHP实现蛇形矩阵,回环矩阵及数字螺旋矩阵的方法分析
2017/05/29 PHP
CI框架(CodeIgniter)公共模型类定义与用法示例
2017/08/10 PHP
PHP实现时间日期友好显示实现代码
2019/09/08 PHP
JS判断元素为数字的奇异写法分享
2012/08/01 Javascript
jquery点击页面任何区域实现鼠标焦点十字效果
2013/06/21 Javascript
javascript中处理时间戳为日期格式的方法
2014/01/02 Javascript
JS之Date对象和获取系统当前时间详解
2014/01/13 Javascript
简单谈谈javascript中的变量、作用域和内存问题
2015/08/30 Javascript
jQuery获取radio选中项的值实例
2016/06/18 Javascript
javascript 动态脚本添加的简单方法
2016/10/11 Javascript
vue高德地图之玩转周边
2017/06/16 Javascript
浅谈React + Webpack 构建打包优化
2018/01/23 Javascript
vue-model实现简易计算器
2020/08/17 Javascript
[01:11:32]VG vs FNATIC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python编程-将Python程序转化为可执行程序[整理]
2007/04/09 Python
使用python编写脚本获取手机当前应用apk的信息
2014/07/21 Python
Python脚本实现Web漏洞扫描工具
2016/10/25 Python
PyTorch CNN实战之MNIST手写数字识别示例
2018/05/29 Python
Python 使用多属性来进行排序
2019/09/01 Python
关于python中的xpath解析定位
2020/03/06 Python
python初步实现word2vec操作
2020/06/09 Python
pytorch __init__、forward与__call__的用法小结
2021/02/27 Python
CSS3 3D旋转rotate效果实例介绍
2016/05/03 HTML / CSS
高清安全摄像头系统:Lorex Technology
2018/07/20 全球购物
美国浴缸、水槽和水龙头购物网站:Vintage Tub & Bath
2019/11/05 全球购物
股权投资意向书
2014/04/01 职场文书
陈安之励志演讲稿
2014/08/21 职场文书
护理见习报告范文
2014/11/03 职场文书
单位考核鉴定意见
2015/06/05 职场文书
写作技巧:如何撰写一份优秀的营销策划书
2019/08/13 职场文书
一文读懂go中semaphore(信号量)源码
2021/04/03 Golang
MySQL导致索引失效的几种情况
2022/06/25 MySQL