【问题标题】:Identifying similar records in SQL Server识别 SQL Server 中的相似记录
【发布时间】:2021-10-27 00:35:54
【问题描述】:

我正在清理客户表。客户表接收来自 4 个不同来源的数据,并且有许多重复记录。我正在使用规则组合来识别类似的客户记录。我的规则是:

  1. 他们有相同的名字、姓氏、电子邮件和手机
  2. 他们有相似的姓氏、手机和电子邮件
  3. 他们有相似的名字、姓氏和电子邮件。

我想为他们分配一个新的 unique_id,如下面的输出:

这是表格和数据的代码:

CREATE TABLE dbo.customer(
customer_id int,
first_name varchar(100),
last_name varchar(100),
email varchar(100),
mobile varchar(20),
unique_id int)
GO

INSERT INTO dbo.customer(customer_id, first_name, last_name, email, mobile)
values (5475872,'','SMITH','john.smith@fakeemail.com','123456'),
(623073,'JOHN','SMITH','john.smith@fakeemail.com','123456'),
(1286681,'JOHN','SMITH','john.smith@fakeemail.com','123456'),
(1303103,'JOHN','SMITH','john.smith@fakeemail.com','123456'),
(7063902,'JOHN','SMITH','john.smith@fakeemail.com','987654'),
(1808155,'JOHN','SMITH','john.smith@fakeemail.com','123456'),
(2151985,'','SMITH','john.smith@fakeemail.com','123456'),
(7221764,'JOHN','SMITH','john.smith@fakeemail.com','987654'),
(1870704,'JOHN','','john.smith@fakeemail.com','123456'),
(887842,'BILL','GATES','bill@microsoft.com','555555'),
(736363,'','GATES','bill@microsoft.com','555555')
GO

谁能帮助我了解如何根据不同的组合生成 unique_id 列?

谢谢

【问题讨论】:

  • 根据问题指南,请展示您的尝试并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。
  • 您尝试做的最困难的部分是定义“相似”的含义

标签: sql-server tsql ssis


【解决方案1】:

我将暂时忽略规则 2 和 3,因为术语“相似”的名字和“相似”的姓氏定义不够明确,无法实施。如果我们只使用规则 1 去重复,我们可以这样做:

WITH unique_id_query AS(
    SELECT first_name, 
           last_name, 
           email, 
           mobile, 
           ROW_NUMBER() OVER (ORDER BY last_name, first_name, email, mobile) AS unique_id
    FROM dbo.customer
    GROUP BY first_name, last_name, email, mobile
)
UPDATE customer
SET unique_id = unique_id_query.unique_id
FROM dbo.customer
JOIN unique_id_query ON customer.first_name=unique_id_query.first_name
                    AND customer.last_name =unique_id_query.last_name
                    AND customer.email     =unique_id_query.email
                    AND customer.mobile    =unique_id_query.mobile

【讨论】:

    【解决方案2】:

    您可以使用以下代码查找重复记录,因为电子邮件在您的所有搜索条件中似乎是唯一且常见的。通过加入 Customer_id 在 Update 中使用,然后选择结果。

     UPDATE C 
     SET C.unique_id =  B.Unique_id
     FROM 
     customer AS C 
        INNER JOIN 
         ( Select 
           DENSE_rank() over ( order by  email desc) AS Unique_id  
           ,customer_id
            from customer 
         )  AS B on  C.customer_id = B.customer_id
    
      SELECT *  FROM dbo.customer
    

    【讨论】:

    • @user2654992 如果需要进一步帮助,请告诉我。很高兴为您提供帮助:)
    猜你喜欢
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    相关资源
    最近更新 更多