You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL求助:如何判断同一列多行匹配百分比并识别潜在重复

识别party_name列的潜在重复记录方案

一、SOUNDEX函数的正确用法(解决你之前的问题)

SOUNDEX是基于发音相似度匹配的函数,单独调用无法对比行记录,必须结合自连接实现配对对比。示例代码:

SELECT a.party_name, b.party_name
FROM your_table a
JOIN your_table b ON a.id < b.id  -- 避免重复输出同一组配对(如a-b和b-a只显示一次)
WHERE SOUNDEX(a.party_name) = SOUNDEX(b.party_name);

如果严格的SOUNDEX匹配找不到结果,可以搭配DIFFERENCE函数——它返回0-4的相似度分数(4为最高匹配度),通过调整阈值筛选近似记录:

SELECT 
    a.party_name, 
    b.party_name, 
    DIFFERENCE(a.party_name, b.party_name) AS similarity_score
FROM your_table a
JOIN your_table b ON a.id < b.id
WHERE DIFFERENCE(a.party_name, b.party_name) >= 3;  -- 分数≥3代表发音高度相似

二、基于编辑距离的模糊匹配

针对拼写相似但发音不同的场景,用编辑距离(两个字符串间需修改的字符数)匹配更精准,不同数据库函数略有差异:

  • MySQL示例(需确保支持LEVENSHTEIN函数,部分版本需自定义实现):
SELECT 
    a.party_name, 
    b.party_name, 
    LEVENSHTEIN(a.party_name, b.party_name) AS edit_distance
FROM your_table a
JOIN your_table b ON a.id < b.id
WHERE LEVENSHTEIN(a.party_name, b.party_name) <= 2;  -- 编辑距离≤2代表拼写高度相似
  • SQL Server示例:
SELECT 
    a.party_name, 
    b.party_name, 
    dbo.Levenshtein(a.party_name, b.party_name) AS edit_distance
FROM your_table a
JOIN your_table b ON a.id < b.id
WHERE dbo.Levenshtein(a.party_name, b.party_name) <= 2;

三、字符串标准化后匹配

先统一字符串格式(去除空格、特殊字符、转大写),再筛选包含或近似匹配的记录:

WITH normalized_names AS (
    SELECT 
        id,
        party_name,
        -- 标准化处理:去除空格、逗号,转大写
        UPPER(REPLACE(REPLACE(party_name, ' ', ''), ',', '')) AS normalized_name
    FROM your_table
)
SELECT a.party_name, b.party_name
FROM normalized_names a
JOIN normalized_names b ON a.id < b.id
WHERE a.normalized_name LIKE CONCAT('%', b.normalized_name, '%')
   OR b.normalized_name LIKE CONCAT('%', a.normalized_name, '%');

内容的提问来源于stack exchange,提问作者esinmal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 15:35:21