SQL:数据去重的三种方法

article/2025/10/23 15:13:00

1、使用distinct去重

distinct用来查询不重复记录的条数,用count(distinct id)来返回不重复字段的条数。用法注意:

  • distinct【查询字段】,必须放在要查询字段的开头,即放在第一个参数;
  • 只能在SELECT 语句中使用,不能在 INSERT, DELETE, UPDATE 中使用;
  • DISTINCT 表示对后面的所有参数的拼接取不重复的记录,即查出的参数拼接每行记录都是唯一的
  • 不能与all同时使用,默认情况下,查询时返回的就是所有的结果。

distinct支持单列、多列的去重方式。

  • 作用于单列

    • 单列去重的方式简明易懂,即相同值只保留1个。
      select distinct name from A    //对A表的name去重然后显示
      
  • 作用于多列

    • 多列的去重则是根据指定的去重的列信息来进行,即只有所有指定的列信息都相同,才会被认为是重复的信息。
    • 注意,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() OVERGROUP 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 BY COL2) 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查询去重数据


http://chatgpt.dhexx.cn/article/AaS2Ygr7.shtml

相关文章

SQL去重的三种方法汇总​

SQL去重的三种方法汇总​ 这里的去重是指:查询的时候, 不显示重复,并不是删除表中的重复项 1.distinct去重 注意的点:distinct 只能一列去重,当distinct后跟大于1个参数时,他们之间的关系是&&(逻辑与)关系&a…

SQL去重

SQL去重是数据分析工作中比较常见的一个场景,今天给大家具体介绍3种去重的方法。在使用SQL提数的时候,常会遇到表内有重复值的时候,比如我们想得到 uv (独立访客),就需要做去重。 在 MySQL 中通常是使用 di…

SQL查询去掉重复数据

本文主要总结数据库去掉重复数据的方法 去掉重复数据的方法: 第一种:distinct 根据单个字段去重,能精确去重;作用在多个字段时,只有当这几个字段的完全相同时,才能去重;关键字distinct只能放…

大数据系统基础 | 绪论

1 什么是大数据 1、Big data is an all-encompassing term for any collection of data sets so large and complex that it becomes difficult to process using traditional data processing apllications. -http://en.wikipedia.org/wiki/Big_data 2、如果一个数据集的规…

大数据测试

目录 1、前言 2、大数据测试策略 3、如何测试大数据应用程序 4、架构测试 5、性能测试 6、性能测试方法 7、性能测试参数 8、测试环境需求 9、大数据测试对比传统数据库测试 10、大数据场景中使用的工具 11、大数据测试的挑战 12、性能测试挑战 1、前言 大数据…

大数据系统测评服务

1. 专业服务 围绕大数据的基础平台、分析软件产品、大数据应用系统、大数据交易系统等,面向政府主管机构、大数据解决方案提供商和大数据建设需求方等提供支撑、测试和咨询服务。测试报告可作为大数据产品或系统市场推广或验收提供客观依据。 大数据基础平台测试…

大数据系统发展的技术路线

自从大数据出来后,数据管理界发生了巨大的变化,技术驱动成为大数据管理系统的一个主要变革力量。 传统的数据库管理系统以结构化数据为主,因此关系数据库系统(RDBMS)可以一统天下满足各类应用需求。然而,大…

大数据平台开发:大数据系统架构模块解析

企业要开展大数据相关业务,首先就需要基于自身的需求,来设计搭建数据系统平台。而大数据系统平台的搭建,需要基于实际需求,来进行系统架构规划。今天我们就从大数据平台开发的角度,来对大数据系统架构模块做一个简单的…

大数据画像系统-1.0

大数据画像系统-1.0 写在最前面操作流程与资源资源获取创建 Flask 工程添加必要第三方库将刚刚下载的文件放入 Flask 工程运行 效果首页城市数据页个人画像页 结语 写在最前面 你能找到这篇文章,那么画像系统是什么,你应该已经知道,大数据是…

【云计算与大数据技术】大数据系统总体架构概述(Hadoop+MapReduce )

一、总体架构设计原则 企业级大数据应用框架需要满足业务的需求,一是要求能够满足基于数据容量大,数据类型多,数据流通快的大数据基本处理需求,能够支持大数据的采集,存储,处理和分析,二是要能…

大数据系统计算技术展望

大数据是新一代信息技术的核心方面和竞争前沿,也是制约大数据产业快速发展的关键瓶颈。大数据技术创新能力已经成为后信息时代衡量国家竞争力的重要指标。与传统信息产业的发展过程相似,大数据必将逐渐形成一个相对独立、体系完善的产业形态,…

什么是大数据系统架构

大数据的应用开发过于偏向底层,具有学习难度大,涉及技术面广的问题,这制约了大数据的普及。现在需要一种技术,把大数据开发中一些通用的,重复使用的基础代码、算法封装为类库,降低大数据的学习门槛&#xf…

大数据系统的基础,大数据存储和计算技术

在存储方面,2000 年左右谷歌等提出的文件系统(GFS)、以及随后的 Hadoop 的分布式文件系统 HDFS(Hadoop Distributed File System)奠定了大数据存储技术的基础。 与传统系统相比,GFS/HDFS 将计算和存储节点在物理上结合在一起,从而避免在数据…

大数据系统架构的基本介绍

从数据处理的一般流程可以看到,在大数据环境下需要的关键技术主要针对海量数据的存储和海量数据的运算。传统的关系数据库经过近40年的发展已经成为了一门成熟同时仍在不断演进的数据管理和分析技术,结构化查询语言(SQL)作为存取关…

大数据系统开发综合实践(一)

又来了新的任务,需要学习一些大数据开发的相关操作,其实之前学过一些内容,但是当初没有好好学,现在还得重新学习起来。 大数据系统中各种模块的作用 HDFS:分布式文件系统,用来存储数据 YARN:用…

大数据系统体系架构(含图示)

目录 1 大数据体系架构图2 数据采集层3 数据计算层4 数据服务层5 数据应用层 1 大数据体系架构图 2 数据采集层 阿里的的日志采集包括两大体系: Aplus.JS是Web端的日志采集技术方案,UserTrack是APP端的日志采集技术方案;在采集技术基础上&am…

大数据系统基础

注:本文是学习由清华大学王建明等老师的公开课大数据系统的笔记。 大数据系统基础 绪论 1、什么是大数据 我们的生活无时无刻不在产生着数据,那是什么在处理这些庞大的数据呢? 1、大数据的定义? 大数据(big data)&#xff0c…

大数据系统架构

大数据系统大体可以分成以下四个部分: 1,数据采集层 2,数据计算层 3,数据服务层 4,数据应用层 下图是阿里巴巴大数据系统架构图: 一、数据采集层 数据采集主要分成以下三块数据: 1&#xff0c…

大数据系统及分析

IDC将大数据技术定义为:“为更经济地从高频率的、大容量的、不同结构和类型的数据中获取价值而设计的新一代架构和技术。” 大数据的关键在于种类繁多、数量庞大、使用传统的数据分析工具无法在可容忍的时间内处理相应的数据。大数据分析主要涉及两个不同的领域&…

大数据测试之大数据系统及特点

一、大数据系统简介 扫健康码了没?相信大家每天都会不厌其烦地听到这种询问。 支付宝付款,相信大家也是每天都在扫码付款,这已经成为了生活的一部分。 这些能产生非常巨量数据的应用系统,我们称之为大数据系统。 大数据系统还需要…