Обновить несколько записей до одной записи - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь объединить записи клиентов с одинаковыми именами, фамилиями, SSN и DOB.Ниже приведена небольшая выборка из таблицы «Клиенты», в которой я определил клиентов, которые отвечают критериям объединения и должны быть объединены.Имена и SSN были изменены, но процесс останется прежним.Присоединив таблицу «Клиенты» к себе в FirstName, LastName, SSN и DOB и используя магию 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)

Так что, если бы у меня был только Рон Уильямс, я мог бынапишите обновление, например:

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 дубликатов учетных записей - как пример Мэри Джонс.

Вместо слияния цепей мы переходим от идентификатора 3910776 к идентификатору 4019229, а затем к идентификатору 4019229 к идентификатору4106801 - для столбцов mergedTo 3910776 и 4019229 должно быть установлено значение 4106801, но я не смог этого сделать.Мысли?

1 Ответ

0 голосов
/ 13 сентября 2018

Вы можете добавить еще одно условие в предложение 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);
...