将多个记录更新为单个记录
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将多个记录更新为单个记录相关的知识,希望对你有一定的参考价值。
我正在尝试合并具有相同名字,姓氏,SSN和DOB的客户记录。以下是我们的Customers表的一小部分样本,其中我确定了符合合并标准且应合并的客户。名称和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都应该将mergedTo列设置为4106801,但我无法完成此操作。思考?
答案
您可以向WHERE子句添加另一个条件以选择最大CID:
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
AND mc.MergeToCID = (SELECT MAX(mcMax.MergeToCID)
FROM #MergeCustomers as mcMax
WHERE mc.CID = mcMax.CID);
以上是关于将多个记录更新为单个记录的主要内容,如果未能解决你的问题,请参考以下文章
SecurityError:replaceState 无法将历史记录更新为在路径、查询或片段以外的组件中不同的 URL