В моих данных клиента есть дубликаты записей, основанные на нескольких ключевых полях, таких как один и тот же адрес электронной почты, телефон или почтовый адрес для разных записей. Я хочу определить наборы повторяющихся записей на основе повторяющейся электронной почты, телефона или почтового адреса и назначить им повторяющийся номер (тот же идентификатор), чтобы пометить их как повторяющихся клиентов. После этого я хочу переместить только уникальные записи клиентов в другую таблицу, которая не будет иметь дубликатов и будет служить основной таблицей записей.
Я могу использовать diff_rank для ранжирования повторяющихся записей с тем же номером, но
застрял потом, не знаю, как назначить новые ключи NewCustID для всех записей.
Исходные таблицы и образцы данных
create table Cust_init(
NewCustID int,
DW_CustID int,
FirstName varchar(50),
LastName varchar(50),
Email varchar(50),
MailAddress varchar(50),
Phone varchar(50)
)
create table MergedCust(
NewCustID int,
DW_CustID int,
FirstName varchar(50),
LastName varchar(50),
Email varchar(50),
MailAddress varchar(50),
Phone varchar(50)
)
insert into dbo.cust_init(DW_CustID,FirstName, LastName,Email,MailAddress,Phone)
values(11,'Ahmad','Raza','ahmaddba@gmail.com','154 Zafarwal, Narowaal','0345 2876543'),
(12,'Iftikhan','Khan','iffikhan@gmail.com','12 A DHA Phase ','0303 56871298'),
(13,'Iftikhan','Khan','iffikhan@gmail.com','12 A DHA Phase ','0303 56871298'),
(14,'Mohsin','Khan','mohsinkaz@gmail.com','55 shadab nagar, Lahore','0301 6791255'),
(15,'Mohsin','Khan','mohsinkaz@gmail.com','55 shadab nagar, Lahore','0301 6791255'),
(16,'Hamid','Alvi','hamidalvi@gmail.com','12 A DHA Phase 2','0300 7071266'),
(17,'Hamid','Alvi','hamidalvi@gmail.com','12 A DHA Phase 2','0300 7071266'),
(18,'Hamid','Alvi','hamidalvi@gmail.com','12 A DHA Phase 2','0300 7071266'),
(19,'Hamid','Alvi','hamidalvi@gmail.com','12 A DHA Phase 2','0300 7071266'),
(20,'Hamid','Alvi','hamidalvi@gmail.com','12 A DHA Phase 2','0300 7071266');
После вставки данных таблица Cust_init должна выглядеть следующим образом:
NewCustID |DW_CustID |FirstName |LastName |Email |MailingAddress |Phone
NULL | 11 |Ahmad |Raza |ahmaddba@gmail.com |154 Zafarwal |0345 2876543
NULL | 12 |Iftikhan |Khan |iffikhan@gmail.com |12 A DHA Phase |0303 56871298
NULL | 13 |Iftikhan |Khan |iffikhan@gmail.com |12 A DHA Phase |0303 56871298
NULL | 14 |Mohsin |Khan |mohsinkaz@gmail.com |55 shadab nagar |0301 6791255
NULL | 15 |Mohsin |Khan |mohsinkaz@gmail.com |55 shadab nagar |0301 6791255
NULL | 16 |Hamid |Alvi |hamidalvi@gmail.com |12 A DHA Phase 2 |0300 7071266
NULL | 17 |Hamid |Alvi |hamidalvi@gmail.com |12 A DHA Phase 2 |0300 7071266
NULL | 18 |Hamid |Alvi |hamidalvi@gmail.com |12 A DHA Phase 2 |0300 7071266
NULL | 19 |Hamid |Alvi |hamidalvi@gmail.com |12 A DHA Phase 2 |0300 7071266
NULL | 20 |Hamid |Alvi |hamidalvi@gmail.com |12 A DHA Phase 2 |0300 7071266
Фаза 1
Я хочу определить дубликаты записей на основе FirstName, LastName, Email и назначить новые ключи для NewCustID (начальный числовой номер изначально равен 1
затем максимальное значение + 1 после начальной загрузки). Числовые ключи NewCustID начинаются с 1 и уникальны для каждой записи, за исключением дубликатов. В случае дублирования, один
числовой ключ должен быть связан со всеми связанными дублирующимися записями.
После назначения NewCustID таблица Cust_init должна выглядеть следующим образом.
NewCustID |DW_CustID |FirstName |LastName |Email |MailingAddress |Phone
1 | 11 |Ahmad |Raza |ahmaddba@gmail.com |154 Zafarwal |0345 2876543
2 | 12 |Iftikhan |Khan |iffikhan@gmail.com |12 A DHA Phase |0303 56871298
2 | 13 |Iftikhan |Khan |iffikhan@gmail.com |12 A DHA Phase |0303 56871298
3 | 14 |Mohsin |Khan |mohsinkaz@gmail.com |55 shadab nagar |0301 6791255
3 | 15 |Mohsin |Khan |mohsinkaz@gmail.com |55 shadab nagar |0301 6791255
4 | 16 |Hamid |Alvi |hamidalvi@gmail.com |12 A DHA Phase 2 |0300 7071266
4 | 17 |Hamid |Alvi |hamidalvi@gmail.com |12 A DHA Phase 2 |0300 7071266
4 | 18 |Hamid |Alvi |hamidalvi@gmail.com |12 A DHA Phase 2 |0300 7071266
4 | 19 |Hamid |Alvi |hamidalvi@gmail.com |12 A DHA Phase 2 |0300 7071266
4 | 20 |Hamid |Alvi |hamidalvi@gmail.com |12 A DHA Phase 2 |0300 7071266
Фаза 2
После назначения NewCustID в таблице Cust_Init я хочу скопировать только уникальные строки в таблицу MergedCust. Сохранение только одной строки с минимальным DW_CustID для повторяющихся записей.
NewCustID |DW_CustID |FirstName |LastName |Email |MailingAddress |Phone
1 | 11 |Ahmad |Raza |ahmaddba@gmail.com |154 Zafarwal |0345 2876543
2 | 12 |Iftikhan |Khan |iffikhan@gmail.com |12 A DHA Phase |0303 56871298
3 | 14 |Mohsin |Khan |mohsinkaz@gmail.com |55 shadab nagar |0301 6791255
4 | 16 |Hamid |Alvi |hamidalvi@gmail.com |12 A DHA Phase 2 |0300 7071266
Мои усилия
Я придумал следующий sql для ранжирования строк с одинаковым номером для дубликатов, но не уверен, как правильно обновить NewCustID.
;WITH cte as (
SELECT NewCustID, DW_CustID, FirstName,LastName, Email, MailAddress, Phone,
dense_rank() OVER (ORDER BY FirstName , LastName, Email ) as RN
FROM dbo.cust_init
)
select RN,FirstName , LastName, Email
from cte
Результирующий набор выглядит следующим образом, я хотел бы изначально назначить RN для NewCustID, чтобы проверить, выполняет ли он цель.
RN |FirstName |LastName |Email
1 |Ahmad |Raza |ahmaddba@gmail.com
2 |Hamid |Alvi |hamidalvi@gmail.com
2 |Hamid |Alvi |hamidalvi@gmail.com
2 |Hamid |Alvi |hamidalvi@gmail.com
2 |Hamid |Alvi |hamidalvi@gmail.com
2 |Hamid |Alvi |hamidalvi@gmail.com
3 |Iftikhan |Khan |iffikhan@gmail.com
3 |Iftikhan |Khan |iffikhan@gmail.com
4 |Mohsin |Khan |mohsinkaz@gmail.com
4 |Mohsin |Khan |mohsinkaz@gmail.com