SQL:数据去重的三种方法
1、使用distinct去重
distinct用来查询不重复记录的条数,用count(distinct id)
来返回不重复字段的条数。用法注意:
- distinct【查询字段】,必须放在要查询字段的开头,即放在第一个参数;
- 只能在SELECT 语句中使用,不能在 INSERT, DELETE, UPDATE 中使用;
- DISTINCT 表示对
后面的所有参数的拼接
取不重复的记录,即查出的参数拼接每行记录都是唯一的 - 不能与all同时使用,默认情况下,查询时返回的就是所有的结果。
distinct支持单列、多列的去重方式。
作用于单列
- 单列去重的方式简明易懂,即相同值只保留1个。
select distinct name from A //对A表的name去重然后显示
- 单列去重的方式简明易懂,即相同值只保留1个。
作用于多列
- 多列的去重则是根据指定的去重的列信息来进行,即只有所有指定的列信息都相同,才会被认为是重复的信息。
- 注意,distinct作用于多列的时候只在开头加上即可,并不用每个字段都加上。distinct必须在开头,在中间是不可以的,会报错,`select id,distinct name from A //错误
select distinct id,name from A //对A表的id和name去重然后显示
配合count使用
select count(distinct name) from A //对A表的不同的name进行计数
按顺序去重时,
order by 的列必须出现在 distinct 中
出错代码
改正后的代码
讨论:若不使用Distinct关键字,则order by后面的字段不一定要放在seletc中
MySQL中使用去重distinct方法的示例详解
【Hive】数据去重
2、使用group by
GROUP BY 语句根据一个或多个列对结果集进行分组。在分组的列上我们可以使用 COUNT, SUM, AVG,等函数,形式为select 重复的字段名 from 表名 group by 重复的字段名;
- group by 对age查询结果进行了分组,自动将重复的项归结为一组。
- 还可以使用count函数,统计重复的数据有多少个
3、使用ROW_NUMBER() OVER
或 GROUP BY 和 COLLECT_SET/COLLECT_LIST
说到要去重,自然会想到 DISTINCT,但是在 Hive SQL 里,它有两个问题:
- DISTINCT 会以 SELECT 出的全部列作为 key 进行去重。也就是说,只要有一列的数据不同,DISTINCT 就认为是不同数据而保留。
- DISTINCT 会将全部数据打到一个 reducer 上执行,造成严重的数据倾斜,耗时巨大。
2.1 ROW_NUMBER() OVER
DISTINCT 的两个问题,用 ROW_NUMBER() OVER 可解。比如,如果我们要按 key1 和 key2 两列为 key 去重,就会写出这样的代码:
WITH temp_table AS (SELECTkey1,key2,[columns]...,ROW_NUMBER() OVER (PARTITION BY key1, key2ORDER BY column ASC) AS rnFROMtable
)SELECTkey1,key2,[columns]...
FROMtemp_table
WHERErn = 1;
这样,Hive 会按 key1 和 key2 为 key,将数据打到不同的 mapper 上,然后对 key1 和 key2 都相同的一组数据,按 column 升序排列,并最终在每组中保留排列后的第一条数据。借此就完成了按 key1 和 key2 两列为 key 的去重任务
。注意 PARTITION BY 在此起到的作用:
- 一是按 key1 和 key2 打散数据,解决上述问题 (2);
- 二是与 ORDER BY 和 rn = 1 的条件结合,按 key1 和 key2 对数据进行分组去重,解决上述问题 (1)。
但显然,这样做十分不优雅(not-elegant),并且不难想见其效率比较低。
row_number() OVER (PARTITION BY
COL1
ORDER BYCOL2
) as num 表示根据COL1
分组,在分组内部根据COL2
排序,此函数计算的值num就表示每组内部排序后的顺序编号(组内连续的唯一的)
2.2 GROUP BY 和 COLLECT_SET/COLLECT_LIST
ROW_NUMBER() OVER 解法的一个核心是利用 PARTITION BY 对数据按 key 分组,同样的功能用 GROUP BY 也可以实现。但是,GROUP BY 需要与聚合函数搭配使用。我们需要考虑,什么样的聚合函数能实现或者间接实现这样的功能呢?不难想到有 COLLECT_SET 和 COLLECT_LIST。
SELECTkey1,key2,[COLLECT_LIST(column)[1] AS column]...
FROMtemp_table
GROUP BYkey1, key2
对于 key1 和 key2 以外的列,我们用 COLLECT_LIST 将他们收集起来,然后输出第一个收集进来的结果
。这里使用 COLLECT_LIST 而非 COLLECT_SET 的原因在于 SET 内是无序的,因此你无法保证输出的 columns 都来自同一条数据。若对于此没有要求或限制,则可以使用 COLLECT_SET,它会更节省资源。
相比前一种办法,由于省略了排序和(可能的)落盘动作,所以效率会高不少。但是因为(可能)不落盘,所以 COLLECT_LIST 中的数据都会缓存在内存当中。如果重复数量特别大,这种方法可能会触发 OOM。此时应考虑将数据进一步打散,然后再合并;或者干脆换用前一种办法。
删除 Hive SQL 查询结果中的重复内容
数据库之MySQL查询去重数据
SQL:数据去重的三种方法相关推荐
- SQL 中去重的三种方法
点击关注上方"逆锋起笔", 设为"置顶或星标",第一时间送达干货 blog.csdn.net/xienan_ds_zj/article/details/1038 ...
- SQL中去重的三种方法,还有谁不会?
来自:CSDN,作者:米竹 链接:https://blog.csdn.net/xienan_ds_zj/article/details/103869048 SQL去重是数据分析工作中比较常见的一个场景 ...
- SQL去重的三种方法汇总
SQL去重的三种方法汇总 这里的去重是指:查询的时候, 不显示重复,并不是删除表中的重复项 1.distinct去重 注意的点:distinct 只能一列去重,当distinct后跟大于1个参数时,他 ...
- 使用SQL查询数据库中重复的数据的的三种方法
第一种方法 select username count(*) u from user_info group by username having u>1 第二种方法 select usernam ...
- Python——数据存储的三种方法
一.CSV文件 1.导入 由于是python自带的库,无需安装就可以使用,只要使用下面命令就可以导入 import csv 2 .使用方法 2.1 从csv文件读入数据 import csv #使用o ...
- java数据输入的步骤_Java学习日志1.4 Scanner 数据输入的三种方法
Scanner sc = new Scanner(System.in); /注意in 是InputStream的缩写,是字节输入流的意思. 整句话的含义就是: new 一个对象,接受从键盘输入的数据, ...
- python教程怎么抓起数据_介绍python 数据抓取三种方法
三种数据抓取的方法正则表达式(re库) BeautifulSoup(bs4) lxml *利用之前构建的下载网页函数,获取目标网页的html,我们以https://guojiadiqu.bmcx.co ...
- 抓取微信小程序数据包的三种方法
前言 做安全测试的都会遇到测试某微信小程序,而微信小程序基本都是基于HTTPS的,所以抓取HTTPS数据包就是最关键的一步.最近几天折腾了一下,整理了比较简单.方便的三种方法. 条件 抓取微信小程序数 ...
- es6数组去重的三种方法
1.es6的三种方法 let arr = [2, 5, 3, 3, 5, 7, 3, 7, 3, 7, 2, 2]// (1)拓展运算符 + new Set 方法let narr1 = [...new ...
最新文章
- pd.dataframe.append
- 如何在Git中克隆所有远程分支?
- 只需三分钟!教会你如何选购及维护UPS蓄电池?
- 大型网站技术架构 读书笔记
- Android system server之WindowManagerService按键消息传播流程
- 全球及中国印刷行业发展形势与十四五应用前景分析报告2022版
- 第五届河南省大学生程序设计竞赛 题解
- C语身教程第三章: C说话挨次筹算匹面(1)
- 和大家探讨一下“虚拟光驱”原理
- 分数求和(信息学奥赛一本通-T1209)
- HTTP 1.1状态代码
- 利用Quartz2D--context绘制矩形
- C/C++中深浅拷贝(map、vector)与内存释放
- Zepto.js 使用手册
- 中文分词技术(中文分词原理)
- Laravel 生成QRCODE
- 小米、百度、bigo 、滴滴 、快手等iOS 面试后的一次阶段性总结
- 服务端渲染和客户端渲染
- 微信小程序如何获取高清用户头像
- Java基础篇——选择结构
热门文章
- 计算机组成原理流水线ppt,[计算机组成原理第讲流水线.ppt
- 数据结构思维导图,超全!超详细!
- 原型工具axure7.0 正式版免费下载
- 进制转换----二进制转十进制
- 第一人称游戏与第三人称游戏的区别
- 引导滤波(guidedFilter)与边窗盒式滤波(sideWindowBoxFilter)的C++与OpenCV实现
- 詳解 Router 路由器
- LeetCode 222. Count Complete Tree Nodes 题解——Java
- Java 8 辣么大(lambda)表达式不慌之—–(四)示例-Collectors中的中的joining 方法和mapping方法
- js---函数基础练习题