У меня есть оригинальный запрос нахождения дубликатов:
Original query:
SELECT
cd1.cust_number_id, cd1.cust_number_id, cd1.First_Name, cd1.Last_Name
FROM @Customer_Data cd1
inner join @Customer_Data cd2 on
cd1.Cd_Id <> cd2.Cd_Id
and cd2.cust_number_id <> cd1.cust_number_id
AND cd2.Flag = N'A'
AND cd2.Cust_active = 1
and cd2.First_Name = cd1.First_Name
and cd2.Last_Name = cd1.Last_Name
inner join @Customer c1 on c1.Cust_id = cd1.cust_number_id
inner join @Customer c2 on c2.cust_id = cd2.cust_number_id
WHERE c1.cust_number <> c2.cust_number
AND cd1.Flag = N'A'
AND cd1.Cust_active = 1
Я оптимизировал его следующим образом.
Optimized query:
SELECT cd1.cust_number_id, cd1.cust_number_id, cd1.First_Name,cd1.Last_Name
FROM (
SELECT cdResult.cust_number_id, cdResult.First_Name,cdResult.Last_Name, COUNT(*) OVER (PARTITION BY cdResult.First_Name, cdResult.Last_Name) as cnt_name_bday
FROM @Customer_Data cdResult
WHERE cdResult.Flag = N'A'
AND cdResult.Cust_active = 1
AND cdResult.First_Name IS NOT NULL
AND cdResult.Last_Name IS NOT NULL) AS cd1
WHERE cd1.cnt_name_bday > 1;
4ой и 5ой строки не должно быть в результате выполнения запроса
Test data:
DECLARE @Customer_Data TABLE
(
Cd_Id INT,
cust_number_id INT,
First_Name NVARCHAR(30),
Last_Name NVARCHAR(30),
Flag NVARCHAR(10),
Cust_active INT
)
INSERT @Customer_Data (Cd_Id,cust_number_id,First_Name,Last_Name, Flag, Cust_active)
VALUES (1, 22, N'Alex', N'Bor', 'A', 1),
(2, 22, N'Alex', N'Bor', 'A', 1),
(3, 24, N'Alex', N'Bor', 'A', 1),
(4, 24, N'Tom', N'Cruse', 'A', 1),
(5, 24, N'Tom', N'Cruse', 'A', 1)
DECLARE @Customer TABLE
(
Cust_id INT,
Cust_number INT
)
INSERT @Customer (Cust_id, Cust_number)
VALUES (22, 022),
(23, 022),
(24, 024),
(25, 024)
У меня возникла проблема в том, что я не могу исключить записи с одинаковым cust_numebr. Результат должен быть, как на первом скриншоте.
Ответ
Исключить одинаковые cust_number довольно просто. Получаем кроме количества строк еще максимальный и минимальный cust_number и проверяем что они не равны. Хотя проверка на количество строк в этом случае становится не нужна.
SELECT cd1.cust_number_id, cd1.cust_number_id, cd1.First_Name,cd1.Last_Name
FROM (
SELECT cdResult.cust_number_id, cdResult.First_Name,cdResult.Last_Name,
MIN(cust_number_id) OVER (PARTITION BY cdResult.First_Name, cdResult.Last_Name) as min_cust,
MAX(cust_number_id) OVER (PARTITION BY cdResult.First_Name, cdResult.Last_Name) as max_cust
FROM @Customer_Data cdResult
WHERE cdResult.Flag = N'A'
AND cdResult.Cust_active = 1
AND cdResult.First_Name IS NOT NULL
AND cdResult.Last_Name IS NOT NULL
) AS cd1
WHERE min_cust!=max_cust;
Комментариев нет:
Отправить комментарий