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学习总结-基础架构概述
Apr 05 MySQL
Mysql 如何批量插入数据
Apr 06 MySQL
MySQL 隔离数据列和前缀索引的使用总结
May 14 MySQL
mysql连接查询中and与where的区别浅析
Jul 01 MySQL
你真的会用Mysql的explain吗
Mar 31 MySQL
MySQL三种方式实现递归查询
Apr 18 MySQL
解决MySQL报“too many connections“错误
Apr 19 MySQL
MySQL选择合适的备份策略和备份工具
Jun 01 MySQL
MySQL数据库表约束讲解
Jun 21 MySQL
Mysql中的触发器定义及语法介绍
Jun 25 MySQL
mysql sock 文件解析及作用讲解
Jul 15 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
html中select语句读取mysql表中内容
2006/10/09 PHP
php页面,mysql数据库转utf-8乱码,utf-8编码问题总结
2015/08/27 PHP
PHP上传Excel文件导入数据到MySQL数据库示例
2016/10/25 PHP
php的命名空间与自动加载实现方法
2019/08/25 PHP
JS子父窗口互相操作取值赋值的方法介绍
2013/05/11 Javascript
Angular中的Promise对象($q介绍)
2015/03/03 Javascript
JavaScript多线程详解
2015/08/12 Javascript
纯CSS3代码实现滑动开关效果
2015/08/19 Javascript
初识简单却不失优雅的Vue.js
2016/09/12 Javascript
详解angularjs利用ui-route异步加载组件
2017/05/21 Javascript
深入理解Nodejs Global 模块
2017/06/03 NodeJs
集合Bootstrap自定义confirm提示效果
2017/09/19 Javascript
vue2.0 兄弟组件(平级)通讯的实现代码
2018/01/15 Javascript
angular json对象push到数组中的方法
2018/02/27 Javascript
Vue的轮播图组件实现方法
2018/03/03 Javascript
小程序自定义日历效果
2018/12/29 Javascript
使用Vue+Django+Ant Design做一个留言评论模块的示例代码
2020/06/01 Javascript
js实现计算器功能
2020/08/10 Javascript
在nodejs中创建child process的方法
2021/01/26 NodeJs
学习python (1)
2006/10/31 Python
Python基础之getpass模块详细介绍
2017/08/10 Python
Pandas GroupBy对象 索引与迭代方法
2018/11/16 Python
Python实现打砖块小游戏代码实例
2019/05/18 Python
用python实现英文字母和相应序数转换的方法
2019/09/18 Python
python中的垃圾回收(GC)机制
2020/09/21 Python
使用HTML5做个画图板的方法介绍
2013/05/03 HTML / CSS
html5 初试 indexedDB(推荐)
2016/07/21 HTML / CSS
处理textarea中的换行和空格
2019/12/12 HTML / CSS
美国非常受欢迎的Spa品牌:Bliss必列斯
2018/04/10 全球购物
Crucial英睿达法国官网:内存条及SSD固态硬盘升级
2018/07/13 全球购物
求职信范文怎么写
2015/03/19 职场文书
公司年会主持词范文!
2019/05/07 职场文书
掌握这项技巧,一年阅读300本书不是梦
2019/09/12 职场文书
Pandas自定义选项option设置
2021/07/25 Python
苹果电脑mac os中货币符号快捷输入
2022/02/17 杂记
动画电影《擅长捉弄人的高木同学》6月10日上映!
2022/03/20 日漫