【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.pswp.cn/bicheng/76356.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76356.shtml
英文地址,請注明出處:http://en.pswp.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 誕生之前,互聯網上缺乏統一的網頁音頻播放標準。當時,大多數音頻播放依…