记录包含以下列:
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中看到如何做到这一点.
你需要在这里做一些编码.