tsql - 将多条记录更新为一条记录
问题描述
我正在尝试合并具有相同名字、姓氏、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
Customer 的表和列 -FirstName
和是 varchar 数据类型。LastName
SSN
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 但我无法做到这一点。想法?
解决方案
您可以在 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);
推荐阅读
- javascript - 按重复和计数对邮政编码进行分组
- cors - angular8 如何将允许 Cors 发送到 Web Api
- spring-boot - Springfox swagger-ui 不发送内容类型标头
- android - Kotlin Retrofit 中是否有与 Kotlin AsyncTask 的 OnPreExecute 等效的方法?
- java - 从构造函数转到不同类的主要方法时,我丢失了数据。怎么了?
- java - 我应该在 android(客户端)和 node js(服务器)中使用 gRPC 进行视频通话吗?
- swift - 在 Swift 中调用实例方法错误消息没有完全匹配
- mongodb - 无法在 mongodb 副本集中执行 $lookup
- javascript - vue-router 带有名称的路由不存在
- django - 姜戈 | HTML 渲染问题 | 查询问题 | 型号 | 意见