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中看到如何做到这一点. 你需要在这里做一些编码. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |