按两列中的任何一列汇总值

时间:2015-09-12 19:03:42

标签: sql tsql sql-server-2005

假设我有一个客户表:

Customers
-----------------------------------------------
Id INTEGER
SSN NCHAR(11)
FullName NVARCHAR(100)
LastPurchaseDate DATETIME

城市周围有许多商店,客户可以在其中任何一个商店注册,每个商店都给他一个不同的Id。无论他在哪里购买,相应的Id都会更新LastPurchaseDate

现在,我需要按人员获取与“最新”Id 对应的LastPurchaseDate。问题是,由于X不同的原因,SSNFullName上可能存在拼写错误。假设我有下一个数据:

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,则该客户被视为同一个人。因此,在此示例中,客户200123389236974186是同一个人。因此,生成的Id应为

200123
215875
123758

我怎样才能做到这一点?

修改

因此,匹配必须位于SSNFullName,但必须准确无误;如果两个字段都不同,即使它是一个字符,它也会被视为一个不同的人。我希望这些数据最终会被清理干净,但这需要时间,因为需要跟踪和纠正大量信息。

1 个答案:

答案 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以避免空值。 您可以通过假设长度函数更长的名称长度来进一步纯化。