Страницы

Поиск по вопросам

пятница, 7 июня 2019 г.

Оптимизация запроса MS SQL

У меня есть оригинальный запрос нахождения дубликатов:
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;

Комментариев нет:

Отправить комментарий