SQL中去除重复数据的几种方法汇总(窗口函数对数据去重)
目录
- 方法1:distinct
- 方法2:group by
- 方法3:窗口函数
使用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稍微复杂些,窗口函数不会减少原表中的行数,而是对字段进行分组后排序。详细的窗口函数讲解
窗口函数的基本语法如下:
<窗口函数> 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 去除重复数据实例详解 有两个意义上的重复记录,一是完全重复的记录,也即所有字段均都重复,二是部分字段重复的记录.对于第一种重复,比较容易解决,只需在查询语句中使用distinct关键字去重,几乎所有数据库系统都支持distinct操作.发生这种重复的原因主要是表设计不周,通过给表增加主键或唯一索引列即可避免. select distinct * from t; 对于第二类重复问题,通常要求查询出重复记录中的任一条记录.假设表t有id,name,address三个字段,id是主键,有重
-
详解mysql数据去重的三种方式
目录 一.背景 二.数据去重三种方法使用 1.通过MySQL DISTINCT:去重(过滤重复数据) 2.group by 3.row_number窗口函数 三.总结 一.背景 最近在和系统模块做数据联调,其中有一个需求是将两个角色下的相关数据对比后将最新的数据返回出去,于是就想到了去重,再次做一个总结. 二.数据去重三种方法使用 1.通过MySQL DISTINCT:去重(过滤重复数据) 1.1.在使用 mysql SELECT 语句查询数据的时候返回的是所有匹配的行. SELECT
-
mysql优化小技巧之去除重复项实现方法分析【百万级数据】
本文实例讲述了mysql优化小技巧之去除重复项实现方法.分享给大家供大家参考,具体如下: 说到这个去重,脑仁不禁得一疼,尤其是出具量比较大的时候.毕竟咱不是专业的DB,所以嘞,只能自己弄一下适合自己去重方法了. 首先按照常规首段,使用having函数检查重复项,完事一个一个的删除.不要问我having检测重复项的sql咋写,你懂得哈...这个在只有几条重复的时候还可以.要是几千上万条不同数据重复,那咋办... 完事呢,咱就考虑了,用having函数查询的时候,原始sql如下: select `n
-
js数组中去除重复值的几种方法
在日常开发中,我们可能会遇到将一个数组中里面的重复值去除,那么,我就将我自己所学习到的几种方法分享出来 去除数组重复值方法: 1,利用indexOf()方法去除 思路:创建一个新数组,然后循环要去重的数组,然后用新数组去找要去重数组的值,如果找不到则使用.push添加到新数组,最后把新数组返回回去就行了 看不懂没关系,上代码就比较容易懂了 function fun(arr){ let newsArr = []; for (let i = 0; i < arr.length; i++) { if(
-
PHP获取POST数据的几种方法汇总
一.PHP获取POST数据的几种方法 方法1.最常见的方法是:$_POST['fieldname']; 说明:只能接收Content-Type: application/x-www-form-urlencoded提交的数据 解释:也就是表单POST过来的数据 方法2.file_get_contents("php://input"); 说明: 允许读取 POST 的原始数据. 和 $HTTP_RAW_POST_DATA 比起来,它给内存带来的压力较小,并且不需要任何特殊的 php.ini
-
oracle数据库导出和oracle导入数据的二种方法(oracle导入导出数据)
方法一:利用PL/SQL Developer工具导出:菜单栏---->Tools---->Export Tables,如下图,设置相关参数即可: 方法二:利用cmd的操作命令导出,详情如下:1:G:\Oracle\product\10.1.0\Client_1\NETWORK\ADMIN目录下有个tnsname.ora文件,内容如下: 复制代码 代码如下: CMSTAR = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL
-
R语言导入导出数据的几种方法汇总
导出: 对于某一数据集导出文件的方法 导出例子:write.csv(data_1,file = "d:/1111111111.csv") 其中data_1是你的数据集,file是你的存储路径和要存储的名字 导入: 1 使用键盘输入数据 (1) 创建一个空数据框(或矩阵),其中变量名和变量的模式需与理想中的最终数据集一致: (2)针对这个数据对象调用文本编辑器,输入你的数据,并将结果保存回此数据对象中. 在下例中,你将创建一个名为mydata的数据框,它含有三个变量:age(数值型).
-
C#去除DataTable重复数据的三种方法
业务需求 最近做一个把源数据库的数据批次导出到目标数据库.源数据库是采集程序采集而来的原始数据库,所以需要对其进行一些处理(过滤一些为空,长度太短或太长,非法字符,重复数据)然后在进行入库. 其中要避免目标库插入重复数据.这重复数据可能是源数据库本身就有重复数据,还有就是已经插入避免重复插入. 过滤自身重复数据解决方案 第一种:采用DataView.ToTable()方法 DataView.ToTable 方法 .NET Framework 2.0 其根据现有 DataView中的行,创建并返回
-
Angularjs的ng-repeat中去除重复数据的方法
本文实例讲述了Angularjs的ng-repeat中去除重复数据的方法.分享给大家供大家参考,具体如下: 一.JS: ngApp.filter('unique', function () { return function (collection, keyname) { var output = [], keys = []; angular.forEach(collection, function (item) { var key = item[keyname]; if (keys.index
-
防止MySQL重复插入数据的三种方法
新建表格 CREATE TABLE `person` ( `id` int NOT NULL COMMENT '主键', `name` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '姓名', `age` int NULL DEFAULT NULL COMMENT '年龄', `address` varchar(512) CHARACTER SET utf8 COLLATE utf8_bin N
-
Python实现删除排序数组中重复项的两种方法示例
本文实例讲述了Python实现删除排序数组中重复项的两种方法.分享给大家供大家参考,具体如下: 对于给定的有序数组nums,移除数组中存在的重复数字,确保每个数字只出现一次并返回新数组的长度 注意:不能为新数组申请额外的空间,只允许申请O(1)的额外空间修改输入数组 Example 1: Given nums = [1,1,2], Your function should return length = 2, with the first two elements of nums being 1
-
Python中移除List重复项的五种方法
本文列些处几种去除在Python 列表中(list)可能存在的重复项,这在很多应用程序中都会遇到的需求,作为程序员最好了解其中的几种方法 以备在用到时能够写出有效的程序. 方法1:朴素方法 这种方式是在遍历整个list的基础上,将第一个出现的元素添加在新的列表中. 示例代码: # Python 3 code to demonstrate # removing duplicated from list # using naive methods # initializing list test_l
-
C++实现LeetCode(26.有序数组中去除重复项)
[LeetCode] 26. Remove Duplicates from Sorted Array 有序数组中去除重复项 Given a sorted array nums, remove the duplicates in-place such that each element appear only once and return the new length. Do not allocate extra space for another array, you must do this
随机推荐
- JavaScript高级程序设计(第三版)学习笔记1~5章
- java 中modCount 详解及源码分析
- java实现电脑定时关机的方法
- Python删除空文件和空文件夹的方法
- 深入理解JavaScript单体内置对象
- js字符串日期yyyy-MM-dd转化为date示例代码
- C语言实现数据结构串(堆分配存储表示法)实例详解
- Android实现搜索功能并本地保存搜索历史记录
- docker.service启动失败:Unit not found的原因及解决办法
- JavaScript九九乘法口诀表的简单实现
- Actionscript与javascript交互实例程序(修改)
- 微信小程序 监听手势滑动切换页面实例详解
- android Jsoup获取网站内容 android获取新闻标题实例
- php中heredoc与nowdoc介绍
- Android动态布局小结
- gulp安装以及打包合并的方法教程
- Android Studio中生成aar文件及本地方式使用aar文件的方法
- Android仿微信图片上传带加号且超过最大数隐藏功能
- 基于Python实现定时自动给微信好友发送天气预报
- 如何修改CentOS服务器时间为北京时间
其他
- pagehelper springboot 一对多查询分页
- python迭代列表时如何访问列表下标索引
- python 正则 匹配负数
- 常见口令破解方式哪种最快
- python换位加密
- idea 2019.2.3破解教程
- golang 调用dll void*
- react把小时分换算成秒
- java实现bitmap旋转90度
- Python爬取帮助文档
- 图片转base64 java
- mysql 输入中文 消失
- 多个RequestParam需要按顺序传吗
- css扭蛋机动画原理
- magic api 默认数据源
- vue自定义指令不触发更新
- 怎么样看js里面有跳转
- PHP禁止刷新重新提交
- vue route.query push 不生效
- ajax post 下载二进制文件