Обновить несколько записей до одной записи

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

Чего я не смог понять, так это обновить запись клиента, когда у нас более двух повторяющихся учетных записей - как в примере Мэри Джонс.

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

1
0
25
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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);

Другие вопросы по теме