You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何基于客户姓名、出生日期、父亲姓名列在SQL Server表中查找重复客户编码?

解决SQL Server中基于相似字段识别重复客户编码的问题

你需要识别那些客户姓名、出生日期、父亲姓名存在格式/拼写相似性的重复客户记录,比如大小写差异、前缀缩写(Md./无前缀、Sr./S)这类情况。下面是一个实用的实现方案,核心思路是先标准化这些字段,再找出重复组:

步骤说明

  1. 标准化字段:统一大小写、移除常见前缀(如Md.Sr.S.),消除格式差异;
  2. 识别重复组:基于标准化后的字段分组,找出分组内记录数>1的组;
  3. 关联原表输出:把重复组关联回原表,得到所有对应的原始记录。

完整SQL代码

假设你的表名为Customers,执行以下查询:

WITH StandardizedCustomers AS (
    SELECT
        [客户编码] AS CustomerCode,
        [客户姓名] AS CustomerName,
        [出生日期] AS DateOfBirth,
        [父亲姓名] AS FatherName,
        -- 标准化客户姓名:移除"Md. "前缀,转大写并去除首尾空格
        UPPER(LTRIM(RTRIM(REPLACE([客户姓名], 'Md. ', '')))) AS StdCustomerName,
        -- 标准化父亲姓名:移除"Sr. "和"S "前缀,转大写并去除首尾空格
        UPPER(LTRIM(RTRIM(REPLACE(REPLACE([父亲姓名], 'Sr. ', ''), 'S ', '')))) AS StdFatherName,
        [出生日期] AS StdDateOfBirth
    FROM Customers
)
SELECT
    sc.CustomerCode AS [客户编码],
    sc.CustomerName AS [客户姓名],
    sc.DateOfBirth AS [出生日期],
    sc.FatherName AS [父亲姓名]
FROM StandardizedCustomers sc
INNER JOIN (
    -- 找出标准化后存在重复的字段组合
    SELECT
        StdCustomerName,
        StdFatherName,
        StdDateOfBirth
    FROM StandardizedCustomers
    GROUP BY StdCustomerName, StdFatherName, StdDateOfBirth
    HAVING COUNT(*) > 1
) duplicateGroups 
    ON sc.StdCustomerName = duplicateGroups.StdCustomerName
    AND sc.StdFatherName = duplicateGroups.StdFatherName
    AND sc.StdDateOfBirth = duplicateGroups.StdDateOfBirth
ORDER BY sc.StdDateOfBirth, sc.StdCustomerName;

代码解释

  • CTE StandardizedCustomers:负责字段标准化,比如把Md. Alam转成ALAMSr. alam转成ALAMS Karim转成KARIM,这样原本格式不同但实质相同的记录会被归为一组;
  • 子查询duplicateGroups:筛选出标准化后重复的字段组合(即存在多条记录的组);
  • 最终关联查询:把原表中属于这些重复组的记录全部提取出来,就是你需要的重复客户列表。

扩展优化

如果需要处理更多类型的拼写相似性(比如发音相近但拼写不同的姓名),可以用SQL Server的SOUNDEXDIFFERENCE函数替代简单的字符串替换:

-- 示例:用SOUNDEX处理发音相似的姓名
SOUNDEX([客户姓名]) AS StdCustomerName,
SOUNDEX([父亲姓名]) AS StdFatherName

SOUNDEX会把发音相似的字符串转换成相同的编码,适合处理拉丁化姓名的模糊匹配,但对非拉丁姓名效果有限,按需选择即可。

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

火山引擎 最新活动