首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【史上最全SQL去重方法】

【史上最全SQL去重方法】

作者头像
贺公子之数据科学与艺术
发布2025-12-18 08:41:28
发布2025-12-18 08:41:28
2530
举报
常见SQL去重方法

使用DISTINCT关键字去除重复行 适用于简单列去重,直接作用于SELECT后的字段:

代码语言:javascript
复制
SELECT DISTINCT column1, column2 FROM table_name;
使用GROUP BY去重

通过分组实现去重,可结合聚合函数:

代码语言:javascript
复制
SELECT column1, MAX(column2) 
FROM table_name 
GROUP BY column1;
窗口函数去重(高级用法)

使用ROW_NUMBER()标记重复数据,适合复杂去重场景:

代码语言:javascript
复制
WITH deduplicated AS (
  SELECT *,
         ROW_NUMBER() OVER(PARTITION BY column1, column2 ORDER BY id) AS rn
  FROM table_name
)
SELECT column1, column2 
FROM deduplicated 
WHERE rn = 1;
实际案例:用户订单去重

场景:同一个用户同一天可能有多条订单记录,保留最新记录:

代码语言:javascript
复制
WITH ranked_orders AS (
  SELECT *,
         ROW_NUMBER() OVER(PARTITION BY user_id, order_date ORDER BY create_time DESC) AS rank
  FROM orders
)
SELECT * FROM ranked_orders WHERE rank = 1;
临时表去重法

适合需要修改原表数据的场景:

代码语言:javascript
复制
CREATE TABLE temp_table AS
SELECT DISTINCT * FROM original_table;

TRUNCATE TABLE original_table;

INSERT INTO original_table
SELECT * FROM temp_table;

DROP TABLE temp_table;
劣势
  • 大数据量时DISTINCT可能性能较差,优先考虑GROUP BY
  • 使用窗口函数时注意PARTITION BY的字段选择
  • 去重可能改变原有数据顺序,需要时显式添加ORDER BY

查询重复

查找重复数据的基本方法

使用GROUP BYHAVING子句可以快速识别重复记录。以下示例基于特定列查找重复值:

代码语言:javascript
复制
SELECT column_name, COUNT(*) 
FROM table_name
GROUP BY column_name
HAVING COUNT(*) > 1;
多列组合重复检查

当需要检查多个列的组合是否重复时,只需在GROUP BY中列出所有相关列:

代码语言:javascript
复制
SELECT column1, column2, COUNT(*)
FROM table_name
GROUP BY column1, column2
HAVING COUNT(*) > 1;
显示完整重复记录

要查看重复记录的所有字段而不仅仅是统计信息,可以使用子查询或窗口函数:

代码语言:javascript
复制
SELECT *
FROM table_name
WHERE column_name IN (
    SELECT column_name
    FROM table_name
    GROUP BY column_name
    HAVING COUNT(*) > 1
);
使用窗口函数的高级方法

ROW_NUMBER()函数能更灵活地处理重复数据,特别适合标记重复项:

代码语言:javascript
复制
SELECT *,
       ROW_NUMBER() OVER(PARTITION BY column_name ORDER BY id) AS row_num
FROM table_name
删除重复数据

保留单条记录并删除其他重复项的标准做法:

代码语言:javascript
复制
DELETE FROM table_name
WHERE id NOT IN (
    SELECT MIN(id)
    FROM table_name
    GROUP BY column_name
);
临时表处理大量重复数据

对于大型数据集,创建临时表处理效率更高:

代码语言:javascript
复制
CREATE TABLE temp_table AS
SELECT DISTINCT * FROM original_table;

TRUNCATE TABLE original_table;

INSERT INTO original_table
SELECT * FROM temp_table;

DROP TABLE temp_table;

去重操作

数据库去重方法

使用DISTINCT关键字 在SQL查询中直接使用DISTINCT可以返回唯一值记录:

代码语言:javascript
复制
SELECT DISTINCT column1, column2 FROM table_name;

GROUP BY分组去重 通过分组操作实现去重,可配合聚合函数使用:

代码语言:javascript
复制
SELECT column1, column2 
FROM table_name 
GROUP BY column1, column2;

窗口函数法(高级去重) 使用ROW_NUMBER()等窗口函数标记重复行后过滤:

代码语言:javascript
复制
WITH deduplicated AS (
    SELECT *,
           ROW_NUMBER() OVER(PARTITION BY column1, column2 ORDER BY id) AS rn
    FROM table_name
)
SELECT * FROM deduplicated WHERE rn = 1;
编程语言去重方案

Python列表去重 使用集合特性或字典保持顺序:

代码语言:javascript
复制
# 简单去重
unique_list = list(set(original_list))

# 保持顺序
unique_list = list(dict.fromkeys(original_list))

Pandas数据框去重 DataFrame提供多种去重方式:

代码语言:javascript
复制
# 基本去重
df.drop_duplicates(subset=['col1','col2'], keep='first')

# 条件去重
df.drop_duplicates(subset=['col1'], keep=False)  # 删除所有重复项
文件内容去重技术

Linux命令行去重 使用sort和uniq组合命令:

代码语言:javascript
复制
sort input_file.txt | uniq > output_file.txt

# 统计重复次数
sort input_file.txt | uniq -c

AWK高效处理 使用AWK实现快速去重:

代码语言:javascript
复制
awk '!seen[$0]++' input_file.txt > output_file.txt
大数据环境解决方案

Hive去重查询 使用DISTRIBUTE BY和窗口函数:

代码语言:javascript
复制
SELECT * FROM (
    SELECT *, 
           ROW_NUMBER() OVER(PARTITION BY key_column DISTRIBUTE BY key_column) as rn
    FROM large_table
) t WHERE rn = 1;

Spark数据去重 通过DataFrame API处理:

代码语言:javascript
复制
df.dropDuplicates(['column1','column2'])

# 内存优化方式
df.distinct().write.mode('overwrite').parquet('output_path')
重复数据识别技巧

相似度匹配算法 对于文本类数据可使用以下方法:

代码语言:javascript
复制
from difflib import SequenceMatcher
def similarity(a, b):
    return SequenceMatcher(None, a, b).ratio()

# 应用示例
[similarity(x,y) for x,y in zip(text_list1, text_list2)]

哈希值比对 生成数据指纹进行快速比对:

代码语言:javascript
复制
import hashlib
def get_hash(value):
    return hashlib.md5(str(value).encode()).hexdigest()

# 创建哈希列用于比对
df['hash'] = df.apply(lambda row: get_hash(tuple(row)), axis=1)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-11-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 常见SQL去重方法
  • 使用GROUP BY去重
  • 窗口函数去重(高级用法)
  • 实际案例:用户订单去重
  • 临时表去重法
  • 劣势
  • 查询重复
    • 查找重复数据的基本方法
    • 多列组合重复检查
    • 显示完整重复记录
    • 使用窗口函数的高级方法
    • 删除重复数据
    • 临时表处理大量重复数据
  • 去重操作
    • 数据库去重方法
    • 编程语言去重方案
    • 文件内容去重技术
    • 大数据环境解决方案
    • 重复数据识别技巧
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档