sql – 将重复的记录与“合并”语法合并在一起

我正在使用sql Server 2014.我目前正在尝试将数百万人员应用程序记录合并到一个人员记录中.

记录包含以下列:

ID,First_Name,Last_Name,DOB,Post_Code,Mobile,Email

一个人可以多次输入他们的详细信息,但由于手指或欺诈他们有时可能会输入错误的细节.

在我的例子中,克里斯托弗已经填写了他的详细信息5次,DOB总是正确的,Mobile和Email包含各种内涵.

我想要做的是在这种情况下获取与此组相关联的min(id)84015283并将其放入新表中,这将是主键,然后您将看到与其关联的其他ID.

例子

NID       CID
------------------
84015283  84015283
84015283  84069198
84015283  84070263
84015283  84369603
84015283  85061159

如果它变得有点复杂,那么2个不同的人可以拥有相同的First_Name,Last_Name和DOB,其他字段中的至少一个必须根据我的示例将“post_code,mobile或email”匹配到组内的另一个记录.

尽管ID为84015283,84069198,84070263,84015283,84069198之间的first_name,last_name,DoB匹配相同,所以他们匹配没有问题,84070263匹配邮政编码,84369603匹配移动设备上一个记录和85061159匹配在之前的移动设备上/ email但不是post_code.

如果将NID放在原始数据集中更容易,我可以使用它,而不是将它全部放在一个单独的表中.

经过一些谷歌搜索并试图解决这个问题后,我认为使用“合并”可能是实现我目标的好方法,但我担心由于涉及的记录数量需要很长时间.

此外,任何例程都必须在随后的新记录中运行.

如果有人可以提供帮助,我已经列出了该示例的代码

DROP TABLE customer_dist

CREATE TABLE [dbo].customer_dist
(
    [id] [int] NOT NULL,[First_Name] [varchar](50) NULL,[Last_Name] [varchar](50) NULL,[DoB] [date] NULL,[post_code] [varchar](50) NULL,[mobile] [varchar](50) NULL,[Email] [varchar](100) NULL,)

INSERT INTO customer_dist (id,DoB,post_code,mobile,Email)
VALUES ('84015283','Christopher','Higg','1956-01-13','CH2 3AZ','07089559829','CH@hotmail.com'),('84069198',('84070263','07089559822','CHigg@AOL.com'),('84369603','CH2 3ZA','Higg@emailme.com'),('85061159','CHRISTOPHER','CH2 3RA',('87065122','Matthew','Davis','1978-05-10','CH5 1TS','07077084692','Matt@gamil.com')

SELECT * FROM customer_dist

以下是预期的结果,对不起,我应该更清楚地说明我想要的结果.

输出表结果

NID         id          First_Name  Last_Name   DoB         post_code   mobile          Email
    84015283    84015283    Christopher Higg            1/13/1956   CH2 3AZ         7089559829  CH@hotmail.com
    84015283    84069198    Christopher Higg            1/13/1956   CH2 3AZ         7089559829  CH@hotmail.com
    84015283    84070263    Christopher Higg            1/13/1956   CH2 3AZ         7089559822  CHigg@AOL.com
    84015283    84369603    Christopher Higg            1/13/1956   CH2 3ZA         7089559829  Higg@emailme.com
    84015283    85061159    CHRISTOPHER Higg            1/13/1956   CH2 3RA         7089559829  CH@hotmail.com
    78065122    87065122    Matthew Davis               05/10/1978  CH5 1TS

7077084692 Matt@gamil.com

OR                          

NID         id
84015283    84015283
84015283    84069198
84015283    84070263
84015283    84369603
84015283    85061159
87065122    87065122

为缓慢的反应道歉.

我已经更新了我的所需输出,我被要求包含一个额外的记录,该记录与其他记录不匹配,但未在我的所需输出中包含此记录.

HABO的响应最接近于在进一步测试其他样本数据时所需的响应,创建了重复项并且逻辑崩溃了.其他样本数据如下: –

declare @customer_dist as Table (
    [id] [int] NOT NULL,[Email] [varchar](100) NULL );


INSERT INTO @customer_dist (id,Email)
VALUES ('32006455','Mary','Wilson','1983-09-20','BT62JA','07706212920','nastie220@yahoo.com'),('35963960','07484863324','nastie@hotmail.com'),('38627975','07484863478','nastie2001@yahoo.com'),('46653041','WILSON','07483888179','nastie2010@yahoo.com'),('48023677',('49560434','07849727199',('49861032',('53130969','Nastie@hotmail.cm'),('33843283','BT148HU','nastie2010@yahoo.co.uk'),'nastie2001@yahoo.com')

SELECT * FROM @customer_dist;

解决方法

这不是一个答案,而是一个太长而不适合评论部分的评论.

由于“平等”条件很复杂,我想我会分阶段进行:

>创建类似客户的“桶”.存储桶标识具有相同id,first_name,last_name和dob的所有客户.在新的“密钥”列上添加索引以加快分组速度.存储桶可能包含一个或多个真实客户.

select
    cast(id as varchar(10)) +
    lower(first_name) + 
    lower(last_name) + 
    convert(varchar,dob,23) as k,id,email
    into bucket
  from customer_dist;

create index ix1 on bucket(k);

>在每个桶上工作并将每个桶上的客户分开.最有可能只有一个,但可以是多个.

在这里,您需要运行一些迭代算法来比较行,将它们标记为相等的组或不同的组,并最终将组合并为单个组.所有这一切都是可能的,但我担心我不会在sql中看到如何做到这一点.

你需要在这里做一些编码.

相关文章

(一)日志传送架构 (1.1)相关服务器 主服务器 :用于生产的服务器,上面运行这生产SQL Server数据库...
(一)事故背景 最近在SQL Server 2012生产数据库上配置完事物复制(发布订阅)后,生产数据库业务出现了...
(一)测试目的 目前公司使用的SQL SERVER 2012高可用环境为主备模式,其中主库可执行读写操作,备库既...
(一)背景个人在使用sql server时,用到了sql server的发布订阅来做主从同步,类似MySQL的异步复制。在...
UNION和OR谓词 找出 product 和 product2 中售价高于 500 的商品的基本信息. select * from product wh...
datawhale组队学习task03