将多个记录更新为单个记录

时间:2018-09-13 19:49:58

标签: tsql sql-update sql-server-2016

我正在尝试合并具有相同名字,姓氏,SSN和DOB的客户记录。以下是“客户”表的一小部分样本,其中我确定了符合合并条件并应合并的客户。名称和SSN已更改,但过程将保持不变。通过在FirstName,LastName,SSN和DOB上将Customers表加入自身,并使用一些<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/css/bootstrap.min.css" integrity="sha384-Smlep5jCw/wG7hdkwQ/Z5nLIefveQRIY9nfy6xoR1uRYBtpZgI6339F5dgvm/e9B" crossorigin="anonymous"> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/js/bootstrap.min.js" integrity="sha384-o+RDsa0aLu++PJvFqy8fFScvbHFLtbvScb8AjopnFD+iEQ7wo/CG0xlczd+2O/em" crossorigin="anonymous"></script> <div id="topic_1">Topic 1</div>CROSS APPLYDENSE_RANK魔术,我能够将每个客户记录放入自己的记录中行并确定应将哪些记录合并到哪个帐户中-我们决定将记录合并到最大的CID中。

LAG

客户的表和列-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 FirstNameLastName是varchar数据类型。

SSN

所以如果我只有罗恩·威廉姆斯,我可以写一个像这样的更新:

CID (int), FirstName, LastName, SSN, isMerged (bit), mergedTo (int), isActive (bit)

#MergeCustomers 只是上面提供的示例数据的临时表。

当我们有两个以上重复的帐户时(例如玛丽·琼斯的例子),我一直无法弄清楚该怎么做。

我们不是从ID 3910776到ID 4019229,然后是ID 4019229到ID 4106801,而是3910776和4019229都应将其mergedTo列设置为4106801,而不是链合并。有想法吗?

1 个答案:

答案 0 :(得分:1)

您可以在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);
相关问题