假设我有一个客户表:
Customers
-----------------------------------------------
Id INTEGER
SSN NCHAR(11)
FullName NVARCHAR(100)
LastPurchaseDate DATETIME
城市周围有许多商店,客户可以在其中任何一个商店注册,每个商店都给他一个不同的Id
。无论他在哪里购买,相应的Id
都会更新LastPurchaseDate
。
现在,我需要按人员获取与“最新”Id
对应的LastPurchaseDate
。问题是,由于X不同的原因,SSN
或FullName
上可能存在拼写错误。假设我有下一个数据:
Id SSN FullName LastPurchaseDate
----------- ----------- ------------- -----------------
200123 123-45-6789 John Doe 10-09-2015
201978 456-78-9012 Mary Jane 15-08-2015
380789 789-01-2345 Pete Zahut 01-08-2015
389236 123-45-6789 Jhon Doe 23-07-2015
215875 456-87-9012 Mary Jane 30-08-2015
974186 123456789 John Doe 28-04-2015
123758 789-01-2345 Pete Zaut 18-08-2015
如果客户具有相同的SSN
或相同的FullName
,则该客户被视为同一个人。因此,在此示例中,客户200123
,389236
和974186
是同一个人。因此,生成的Id
应为
200123
215875
123758
我怎样才能做到这一点?
修改
因此,匹配必须位于SSN
或FullName
,但必须准确无误;如果两个字段都不同,即使它是一个字符,它也会被视为一个不同的人。我希望这些数据最终会被清理干净,但这需要时间,因为需要跟踪和纠正大量信息。
答案 0 :(得分:0)
第一次数据清理将是:
(select REPLACE(SSN, '-', '') as SSN ,
Min(Id) as Id, Max(FullName) as FullName
max(LastPurchaeDate) as LastPurchaeDate
from Customers group by 1)
这将合并所有SSN号码。此外,它将假设最低Id是真实Id并且在名称上设置max以避免空值。 您可以通过假设长度函数更长的名称长度来进一步纯化。