【SQL】基于多源SQL 去重方法对比 -- 精华版

【SQL】基于SQL 去重方法对比 -- 精华版

  • 一、引言
  • 二、基于SQL去重方法完整对比
    • 1. MySQL去重方法及优劣势
      • 1.1 ​DISTINCT关键字
      • 1.2 GROUP BY子句
      • 1.3 UNION系列操作
      • 1.4 子查询 + 自关联
    • 2. Hive去重方法及优劣势
      • 2.1 DISTINCT关键字
      • 2.2 ​GROUP BY子句
      • 2.3 ​ROW_NUMBER窗口函数
      • 2.4 UNION系列操作
      • 2.5 近似去重算法
  • 二、方法对比与适用场景
  • 三、总结与场景建议
    • 1. ​MySQL场景
    • 2. Hive场景
    • 3.通用优化策略

一、引言

  • 近期参加了数据岗位的一些面试(如下图:近几年的面试数据),非常多的同学在简历上会写熟悉、精通SQL,但一旦进行原理性(对应数据开发岗)或者实操性(数据分析、数据产品岗)的沟通和测试,往往表现的不尽如人意。所以打算再开一个【SQL】的专栏,分享一些SQL的知识和技巧。
    在这里插入图片描述

二、基于SQL去重方法完整对比

1. MySQL去重方法及优劣势

1.1 ​DISTINCT关键字

  • 方法:直接对字段组合去重,语法简单。
  • 优势:操作直观,适合小数据集或快速测试。
  • 劣势
    • 性能差:大数据量时触发全表扫描,效率低。
    • 功能局限:无法筛选特定行(如保留最新记录)。

SELECT DISTINCT test_id FROM test;         -- 单字段去重
SELECT COUNT(DISTINCT test_id) FROM test;  -- 去重计数

1.2 GROUP BY子句

  • 方法:分组后取唯一值,常配合子查询统计总数。
  • 优势
    • 效率较高:单字段去重时比DISTINCT更快。
    • 支持聚合:可结合COUNT、MAX等函数。
  • 劣势
    • 结果不稳定:非GROUP BY字段可能返回随机值(MySQL特有)。
    • 复杂度高:多字段分组时计算资源消耗大。

SELECT test_id FROM test GROUP BY test_id;
SELECT COUNT(test_id) FROM (SELECT test_id FROM test GROUP BY test_id) tmp;

1.3 UNION系列操作

  • 方法:合并多表数据自动去重,需注意性能问题。
  • 优势:适合跨表数据合并场景。
  • 劣势
    • 资源消耗大,UNION去重需全局排序,大数据量性能差。

-- UNION自动去重,性能低 
SELECT test_id FROM test_2023 
UNION 
SELECT test_id FROM test_2024-- UNION ALL + DISTINCT分阶段处理 
SELECT DISTINCT user_id FROM (SELECT user_id FROM orders_2023 UNION ALL SELECT user_id FROM orders_2024) tmp;

1.4 子查询 + 自关联

  • 方法:通过条件排除重复记录,保留特定行。
  • 优势:精准控制保留逻辑(如保留时间最新的记录)。
  • 劣势
    • 性能差:嵌套查询复杂度高,不适合大规模数据。

SELECT * FROM test t1 
WHERE NOT EXISTS (SELECT 1 FROM test t2 WHERE t1.test_id = t2.test_id AND t1.time < t2.time
);

2. Hive去重方法及优劣势

2.1 DISTINCT关键字

  • 方法:语法与MySQL一致,底层优化效果更佳。
  • 优势:适合小规模数据或快速验证。
  • 劣势
    • 性能瓶颈:大数据量时仍需全表扫描,需配合分区或列式存储优化。
SELECT DISTINCT user_id FROM user ;

2.2 ​GROUP BY子句

  • 方法:分组去重,支持多字段组合。
  • 优势
    • 高效稳定:结合MapReduce优化,性能优于DISTINCT。
    • 聚合灵活:支持COUNT、SUM等函数。
  • 劣势:无法灵活筛选组内特定行。

SELECT user_id  FROM user GROUP BY user_id ;

2.3 ​ROW_NUMBER窗口函数

  • 方法:按分区排序后取唯一值,适合复杂逻辑。
  • 优势
    • 灵活性强:可指定保留最新、最旧或特定排序规则的数据。
    • 适用性广:适合“一对多”关系数据去重。
  • 劣势
    • 性能要求高:需合理设置分区和排序字段以避免性能问题。

SELECT user_id, log_time 
FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY log_time DESC) rn FROM user
) tmp 
WHERE rn = 1

2.4 UNION系列操作

  • 方法:合并跨分区或跨表数据,需权衡资源消耗。
  • 优势:适合增量数据整合或历史表合并。
  • 劣势
    • 资源占用高:UNION去重需全局排序,可能占用大量内存。

-- UNION自动去重
SELECT user_id FROM user_1 UNION SELECT user_id FROM user_2;
-- UNION ALL + DISTINCT分阶段处理
SELECT DISTINCT user_id FROM (SELECT user_id FROM user_1 UNION ALL SELECT user_id FROM user_2) tmp;

2.5 近似去重算法

  • 方法:通过概率算法快速估算去重值,如HyperLogLog,一般日常涉及较少。
  • 优势
    • 极速计算:适合超大规模数据(如TB级日志)。
  • 劣势
    • 结果非精确:仅适用于统计场景,不适用于业务明细查询。

SELECT APPROX_COUNT_DISTINCT(user_id) FROM user;  -- 误差率约1%

二、方法对比与适用场景

方法MySQL适用性Hive适用性优势劣势
DISTINCT小数据量简单去重小数据量简单数据量大性能差,无法筛选特定行
GROUP BY高效单字段高效多字段组合支持聚合,效率高mysql不稳定
ROW_NUMBER不支持复杂去重灵活性强,支持排序逻辑资源消耗高
UNION系列跨表合并去重跨分区/表合并去重处理多源数据性能低,资源消耗高

三、总结与场景建议

1. ​MySQL场景

  • 简单查询:GROUP BY、DISTINCT均可
  • 跨表合并:使用UNION ALL + DISTINCT分阶段处理。
  • 保留最新记录:通过子查询+自关联实现。

2. Hive场景

  • 常规去重:GROUP BY(性能稳定)、ROW_NUMBER(保留特定排名)。
  • ​增量数据:UNION ALL + ROW_NUMBER避免全表扫描。
  • 超大数据统计:用APPROX_COUNT_DISTINCT平衡性能与精度。

3.通用优化策略

  • 索引/分区:MySQL加索引,Hive用分区表提升效率。
  • 资源管理:Hive合理配置MapReduce资源,避免OOM。
  • 存储格式:Hive优先选择ORC/Parquet列式存储。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/76356.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电脑命名配置很高,为什么运行软件特别卡

估计很多同学都碰见过这种情况&#xff0c;以我的Redmi G为例&#xff0c;I9-14待CPU&#xff0c;又换了一条内存条&#xff0c;现有配置I9-14900&#xff0c;40G内存5200MT/s&#xff0c;4060显卡&#xff0c;为啥运行两个办公软件就卡的不行&#xff0c;风扇狂转&#xff0c;…

Spring Boot默认注册的转换器列表及其功能说明。这些转换器使得控制器方法可以直接接收Integer、Long、Date等类型参数,无需手动实现转换

以下是Spring Boot默认注册的转换器列表及其功能说明。这些转换器使得控制器方法可以直接接收Integer、Long、Date等类型参数&#xff0c;无需手动实现转换&#xff1a; 默认转换器列表及功能 1. 基础类型转换器 转换器名称功能示例场景StringToIntegerConverter将字符串转换…

chrome提示https不安全, 不能记住账号密码怎么办? 可以利用js输入账号

背景: 在内网搭建的服务, 由于https证书问题, 可能会被chrome浏览器提示不安全 此时, 默认的记住账号密码功能就无法使用, 那么此时只能手动输入了吗? 想到了几种方案 1.利用外置软件, 模拟按键输入(比如按键精灵, 缺点是依赖外部软件, 运行速度也慢, 且执行时占用了输入焦…

探秘Transformer系列之(25)--- KV Cache优化之处理长文本序列

探秘Transformer系列之&#xff08;25&#xff09;— KV Cache优化之处理长文本序列 文章目录 探秘Transformer系列之&#xff08;25&#xff09;--- KV Cache优化之处理长文本序列0x00 概述0x01 优化依据1.1 稀疏性1.2 重要性1.3 小结 0x02 稀疏化1.1 分类1.2 静态稀疏化1.2.1…

【开发经验】结合实际问题解决详述HTTPS通信过程

最近的开发调试过程中涉及到了HTTPS发送与接收&#xff0c;遇到实际问题才发现对这部分尚属于一知半解。结合实际问题的解决过程来详细整理以下HTTPS通信过程。 需要调试的功能为BMC作为客户端向搭建好的Web服务器发送HTTPS请求&#xff0c;Web服务器负责接收处理发送过来的HT…

【Android】Android Activity 横屏设置详解及常见异常问题解决方法汇总

在 Android 开发中&#xff0c;我们经常需要控制 Activity 的屏幕方向&#xff0c;例如视频播放、游戏、VR/AR 应用等场景通常希望默认横屏显示。本文将讲解如何通过 Manifest 配置 和 Java/Kotlin 代码 设置横屏显示&#xff0c;并分析常见设置无效的原因与解决方法。 一、通过…

文件相关:echo重定向管道命令扩展详解

一、echo 文字内容 echo 会在终端中显示参数指定的文字&#xff0c;通常会和 重定向 联合使用 二、重定向 > 和 >> Linux 允许将命令执行结果 重定向到一个 文件将本应显示在终端上的内容 输出 / 追加 到指定文件中 其中&#xff1a; >表示输出&#xff0c;会覆…

Python 中使用单例模式

有这么一种场景&#xff0c;Web服务中有一个全局资源池&#xff0c;在需要使用的地方就自然而言引用该全局资源池即可&#xff0c;此时可以将该资源池以单例模式实现。随后&#xff0c;需要为某一特殊业务场景专门准备一个全局资源池&#xff0c;于是额外复制一份代码新建了一个…

websocket深入-webflux+websocket

文章目录 背景版本约定配置文件代码使用webflux使用websocket配置文件handler基类实现类注册路由 背景 基于更复杂的情况和更高的开发要求&#xff0c;我们可能会遇到必须同时要使用webflux和websocket的情况。 版本约定 JDK21Springboot 3.2.0Fastjson2lombok 配置文件 &…

致远OA —— 表单数据获取(前端)

文章目录 :apple: 业务需求描述 &#x1f34e; 业务需求描述 测试案例&#xff1a; https://pan.quark.cn/s/3f58972f0a27 官网地址&#xff1a; 需求描述&#xff1a; 点击获取数据接口&#xff0c;调用后台&#xff0c;将从后台查询到的数据回写到表单的内容中。 如下…

51c嵌入式~继电器~合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/13775821 一、继电器应用细节 继电器的应用&#xff0c;相信大家都知道&#xff0c;在电路中只要给它供电、断电也就可以工作了。本文讨论它的应用细节。 现在流行的接法 图中&#xff0c;继电器的线圈经过Q1作为开关&am…

前端性能优化核弹级方案:CSS分层渲染+Wasm,首屏提速300%!

前端性能优化核弹级方案&#xff1a;CSS分层渲染Wasm实现首屏提速300%的终极指南 在当今Web应用日益复杂的背景下&#xff0c;性能优化已成为前端开发的核心竞争力。本文将深入剖析两种革命性的前端性能优化技术——CSS分层渲染与WebAssembly(Wasm)的协同应用&#xff0c;揭示…

初识Redis · 简单理解Redis

目录 前言&#xff1a; 分布式系统 开源节流 认识Redis 负载均衡 缓存 微服务 前言&#xff1a; 本文只是作为Redis的一篇杂谈&#xff0c;简单理解一下Redis为什么要存在&#xff0c;以及它能做到和它不能做到的事儿&#xff0c;简单提及一下它对应的优势有什么&#…

网络通讯协议UDP转发TCP工具_UdpToTcpRelay_双向版

UDP/TCP网络转发器程序说明书 1. 程序概述 本程序是一个高性能网络数据转发工具&#xff0c;支持UDP和TCP协议之间的双向数据转发&#xff0c;并具备以下核心功能&#xff1a; 协议转换&#xff1a;实现UDP↔TCP协议转换数据转换&#xff1a;支持十六进制/ASCII格式的数据转…

MCP 服务搭建与配置学习资源部分汇总

MCP 服务搭建与配置学习资源汇总 目录 图文教程GitHub 示例项目视频课程不同开发语言实现案例 图文教程 Cherry Studio 配置 MCP 服务教程 – 介绍如何在 Cherry Studio 客户端中配置 MCP 服务器&#xff0c;让 AI 模型能够自主调用本地/网络工具来完成任务&#xff0c;提升…

Selenium中`driver.get(htmlfile)`方法可能出现的超时问题

针对Selenium中driver.get(htmlfile)方法可能出现的超时问题&#xff0c;以下是几种改进方案及具体实现方法&#xff1a; 1. 设置页面加载超时时间 通过set_page_load_timeout()方法直接控制页面加载的最大等待时间。若超时&#xff0c;会抛出TimeoutException异常&#xff0c…

20分钟了解 MMAction2 框架设计

步骤3&#xff1a;构建一个识别器 # 修改此处 predictions[0].pred_score -> predictions[0].pred_scores.item print(Scores of Sample[0], predictions[0].pred_scores.item)步骤4&#xff1a;构建一个评估指标 # 修改此处 data_sample[pred_score].cpu().numpy() ->…

单轨小车悬挂输送机安全规程

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。欢迎大家使用我们的仓储物流技术AI智能体。 新书《智能物流系统构成与技术实践》 新书《智能仓储项目出海-英语手册&#xff0c;必备&#xff01;》 完整版文件和更多学习资料&#xf…

C++之多态

文章目录 一、多态的概念 多态的定义与类型 二、多态的实现 三、虚函数 虚函数的概念 虚函数的重写/覆盖 协变 析构函数的重写/覆盖 override,final关键字 override final 纯虚函数与抽象类 三个概念辨析 四、多态实现的原理 虚函数表指针 动态绑定与静态绑定 …

深入理解 HTML5 Audio:网页音频播放的新时代

在网页开发领域,音频的嵌入和播放一直是一个重要且不断演进的话题。HTML5 的出现,为网页音频播放带来了标准化的解决方案,极大地改善了开发者和用户的体验。 一、HTML5 之前的音频播放状况 在 HTML5 诞生之前,互联网上缺乏统一的网页音频播放标准。当时,大多数音频播放依…