Oracle数据库数据编程SQL<01. 课外关注:数据库查重方法全面详解>

查重是数据库管理和数据分析中的常见需求,以下是各种查重方法的全面总结,涵盖不同场景和技术手段。

更多Oracle学习内容请查看:Oracle保姆级超详细系列教程_Tyler先森的博客-CSDN博客

目录

一、基础SQL查重方法

1. 使用GROUP BY和HAVING

2. 使用窗口函数

3. 使用自连接

二、高级查重技术

1. 模糊查重(相似度匹配)

1.1 使用SOUNDEX函数(语音相似)

1.2 使用Levenshtein距离(编辑距离)

1.3 使用UTL_MATCH包(Oracle)

2. 大数据量查重优化

2.1 使用HASH值比较

2.2 分区查重

3. 跨表查重

三、数据库特定查重方法

1. Oracle查重技术

1.1 使用分析函数

1.2 使用Oracle GoldenGate或Data Compare工具

2. MySQL查重技术

2.1 使用临时表删除重复

2.2 使用INSERT IGNORE

3. SQL Server查重技术

3.1 使用MERGE语句

3.2 使用SSIS数据流任务

四、程序化查重方法

1. Python + Pandas

2. Java查重示例

3. 使用Apache Spark(大数据场景)

五、数据质量工具集成

1. 专业数据质量工具

2. 开源工具

六、查重后的处理策略

1. 删除重复数据

2. 合并重复记录

3. 标记重复记录

七、预防重复数据的策略

1. 数据库约束

2. 使用序列/自增ID

3. 应用层校验

4. 使用MERGE/UPSERT

八、特殊数据类型查重

1. JSON数据查重

2. 时空数据查重

3. 图像/二进制数据查重

九、性能优化建议

十、行业特定查重案例

1. 金融行业(反洗钱)

2. 电商行业(刷单检测)

3. 医疗行业(重复就诊)


一、基础SQL查重方法

1. 使用GROUP BYHAVING

-- 单列查重
SELECT column_name, COUNT(*)
FROM table_name
GROUP BY column_name
HAVING COUNT(*) > 1;

-- 多列组合查重
SELECT column1, column2, COUNT(*)
FROM table_name
GROUP BY column1, column2
HAVING COUNT(*) > 1;

2. 使用窗口函数

-- 使用ROW_NUMBER()标记重复行
SELECT *,
       ROW_NUMBER() OVER(PARTITION BY column1, column2 ORDER BY id) AS rn
FROM table_name;

-- 提取重复记录
WITH dup_check AS (
    SELECT *,
           ROW_NUMBER() OVER(PARTITION BY column1, column2 ORDER BY id) AS rn
    FROM table_name
)
SELECT * FROM dup_check WHERE rn > 1;

3. 使用自连接

-- 查找完全重复的行
SELECT a.*
FROM table_name a
JOIN table_name b 
ON a.column1 = b.column1 
AND a.column2 = b.column2
AND a.id <> b.id;  -- 排除自连接

二、高级查重技术

1. 模糊查重(相似度匹配)

1.1 使用SOUNDEX函数(语音相似)

SELECT a.name, b.name
FROM customers a, customers b
WHERE a.id < b.id  -- 避免重复比较
AND SOUNDEX(a.name) = SOUNDEX(b.name);

1.2 使用Levenshtein距离(编辑距离)

-- Oracle需要自定义函数
CREATE OR REPLACE FUNCTION levenshtein( s1 IN VARCHAR2, s2 IN VARCHAR2 )
RETURN NUMBER IS [...];

SELECT a.name, b.name
FROM products a, products b
WHERE a.id < b.id
AND levenshtein(a.name, b.name) <= 3;  -- 允许3个字符差异

1.3 使用UTL_MATCH包(Oracle)

SELECT a.name, b.name, 
       UTL_MATCH.JARO_WINKLER_SIMILARITY(a.name, b.name) AS similarity
FROM customers a, customers b
WHERE a.id < b.id
AND UTL_MATCH.JARO_WINKLER_SIMILARITY(a.name, b.name) > 90;  -- 相似度>90%

2. 大数据量查重优化

2.1 使用HASH值比较

-- 创建哈希列
ALTER TABLE large_table ADD hash_value RAW(16);

-- 更新哈希值(组合关键列)
UPDATE large_table 
SET hash_value = DBMS_CRYPTO.HASH(
    UTL_I18N.STRING_TO_RAW(column1||column2||column3, 'AL32UTF8'),
    2);  -- 2=MD4算法

-- 查找重复哈希
SELECT hash_value, COUNT(*)
FROM large_table
GROUP BY hash_value
HAVING COUNT(*) > 1;

2.2 分区查重

-- 按日期分区查重
SELECT user_id, action_date, COUNT(*)
FROM user_actions
PARTITION (p_2023_01)  -- 指定分区
GROUP BY user_id, action_date
HAVING COUNT(*) > 1;

3. 跨表查重

-- 查找两个表中都存在的记录
SELECT a.*
FROM table1 a
WHERE EXISTS (
    SELECT 1 FROM table2 b
    WHERE a.key_column = b.key_column
);

-- 使用INTERSECT
SELECT key_column FROM table1
INTERSECT
SELECT key_column FROM table2;

三、数据库特定查重方法

1. Oracle查重技术

1.1 使用分析函数

-- 查找重复并保留最新记录
SELECT *
FROM (
    SELECT t.*,
           ROW_NUMBER() OVER(PARTITION BY id_number, name ORDER BY create_date DESC) AS rn
    FROM persons
) 
WHERE rn = 1;  -- 只保留每组最新记录

1.2 使用Oracle GoldenGate或Data Compare工具

专业工具提供可视化比较和同步功能。

2. MySQL查重技术

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tyler先森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值