【发布时间】:2019-02-18 14:37:57
【问题描述】:
我正在尝试合并具有相同名字、姓氏、SSN 和 DOB 的客户记录。下面是我们客户表的一个小样本,我在其中确定了满足合并标准并应合并的客户。姓名和 SSN 已更改,但过程将保持不变。通过在 FirstName、LastName、SSN 和 DOB 上将 Customers 表连接到自身并使用一些 CROSS APPLY、DENSE_RANK 和 LAG 魔术 - 我能够将每个客户记录放在它自己的行中并确定哪些记录应该合并到哪个账户 - 我们决定将记录合并到最大的 CID。
CID FirstName LastName SSN DOB MergeToCID Ranking
5728956 RON WILLIAMS 111111111 1988-05-17 5884361 1
5884361 RON WILLIAMS 111111111 1988-05-17 NULL 1
1722065 JOE SMITH 222222222 1981-01-15 2660126 2
2660126 JOE SMITH 222222222 1981-01-15 NULL 2
3910776 MARY JONES 333333333 1966-09-16 4019229 3
4019229 MARY JONES 333333333 1966-09-16 4106801 3
4106801 MARY JONES 333333333 1966-09-16 NULL 3
客户的表和列 - FirstName、LastName 和 SSN 是 varchar 数据类型。
CID (int), FirstName, LastName, SSN, isMerged (bit), mergedTo (int), isActive (bit)
因此,如果我只有 Ron Williams,我可以编写如下更新:
update C
set C.mergedTo = mc.MergeToCID, C.isMerged = 1, C.isActive = 0
from Customers as C
inner join #MergeCustomers as mc on mc.CID = C.CID
where mc.MergeToCID IS NOT NULL;
#MergeCustomers 只是上面提供的示例数据的临时表。
当我们有超过 2 个重复帐户时,我无法弄清楚如何更新客户的记录 - 例如 Mary Jones 示例。
而不是链式合并,我们从 ID 3910776 到 ID 4019229,然后从 ID 4019229 到 ID 4106801 - 3910776 和 4019229 都应该将它们的 mergeTo 列设置为 4106801,但我无法做到这一点。想法?
【问题讨论】:
标签: tsql sql-update sql-server-2016