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 相关文章推荐
仅用一句SQL更新整张表的涨跌幅、涨跌率的解决方案
May 06 MySQL
Mysql 用户权限管理实现
May 25 MySQL
MySql 8.0及对应驱动包匹配的注意点说明
Jun 23 MySQL
低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限
Jul 01 MySQL
MySQL系列之七 MySQL存储引擎
Jul 02 MySQL
MySQL深度分页(千万级数据量如何快速分页)
Jul 25 MySQL
MySQL非空约束(not null)案例讲解
Aug 23 MySQL
MySQL七大JOIN的具体使用
Feb 28 MySQL
千万级用户系统SQL调优实战分享
Mar 03 MySQL
mysql 子查询的使用
Apr 28 MySQL
Mysql的Table doesn't exist问题及解决
Dec 24 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中用数组的方法设置cookies
2011/04/21 PHP
将时间以距今多久的形式表示,PHP,js双版本
2012/09/25 PHP
基于MySQL到MongoDB简易对照表的详解
2013/06/03 PHP
php截取指定2个字符之间字符串的方法
2015/04/15 PHP
用PHP代码给图片加水印
2015/07/01 PHP
PHP使用redis实现统计缓存mysql压力的方法
2015/11/14 PHP
基于PHP实现栈数据结构和括号匹配算法示例
2017/08/10 PHP
PHP添加PNG图片背景透明水印操作类定义与用法示例
2019/03/12 PHP
JSChart轻量级图形报表工具(内置函数中文参考)
2010/10/11 Javascript
javascript 全选与全取消功能的实现代码
2012/12/23 Javascript
js实现简单的星级选择器提交效果适用于评论等
2013/10/18 Javascript
纯js分页代码(简洁实用)
2013/11/05 Javascript
JQuery 控制内容长度超出规定长度显示省略号
2014/05/23 Javascript
node.js中RPC(远程过程调用)的实现原理介绍
2014/12/05 Javascript
jQuery实现网站添加高亮突出显示效果的方法
2015/06/26 Javascript
用vue和node写的简易购物车实现
2017/04/25 Javascript
bootstrap响应式工具使用详解
2017/11/29 Javascript
小程序实现页面顶部选项卡效果
2018/11/06 Javascript
JS解惑之Object中的key是有序的么
2019/05/06 Javascript
关于vue属性使用和不使用冒号的区别说明
2020/10/22 Javascript
Python的Bottle框架中获取制定cookie的教程
2015/04/24 Python
详解python中的文件与目录操作
2017/07/11 Python
python实现反转部分单向链表
2018/09/27 Python
几个适合python初学者的简单小程序,看完受益匪浅!(推荐)
2019/04/16 Python
解决Python找不到ssl模块问题 No module named _ssl的方法
2019/04/29 Python
正则给header的冒号两边参数添加单引号(Python请求用)
2019/08/09 Python
Windows10下Tensorflow2.0 安装及环境配置教程(图文)
2019/11/21 Python
Hammitt官网:设计师手袋
2020/05/23 全球购物
开服装店计划书
2014/08/15 职场文书
社区党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
化验员岗位职责
2015/02/14 职场文书
现场施工员岗位职责
2015/04/11 职场文书
《1942》观后感
2015/06/08 职场文书
获奖感言一句话
2015/07/31 职场文书
个人落户申请书怎么写?
2019/06/28 职场文书
总结Pyinstaller打包的高级用法
2021/06/28 Python