Member 10183768 Ответов: 0

Нужно объединить в одну запись каждую группу, и данные объединяются таким образом, что мы имеем наиболее полный набор атрибутов.


SELECT a.*
FROM MRSVoid.dbo.Customer_Dataset$ a
CROSS JOIN
(SELECT 
[Customer_LastName]
      ,[Customer_FirstName]
      ,[Customer_AddressLine1]

      ,[Customer_HomePhone]
      ,[Customer_InternetEmail]
FROM MRSVoid.dbo.Customer_Dataset$ 
GROUP BY [Customer_LastName],
         [Customer_FirstName],
		 [Customer_AddressLine1],
		 [Customer_InternetEmail],
		 [Customer_HomePhone]
HAVING count(*) > 1) b
where ((a.Customer_LastName = b.Customer_LastName) OR (a.Customer_LastName is NULL AND b.Customer_LastName is NULL))
AND ((a.Customer_FirstName = b.Customer_FirstName) OR (a.Customer_FirstName is NULL AND b.Customer_FirstName is NULL))
AND ((a.Customer_AddressLine1 = b.Customer_AddressLine1) OR (a.Customer_AddressLine1 is NULL AND b.Customer_AddressLine1 is NULL))
AND ((a.Customer_InternetEmail = b.Customer_InternetEmail) OR (a.Customer_InternetEmail is NULL AND b.Customer_InternetEmail is NULL))
AND ((a.Customer_HomePhone = b.Customer_HomePhone) OR (a.Customer_HomePhone is NULL AND b.Customer_HomePhone is NULL))
order by Customer_AddressLine1


Этот запрос дает мне дубликаты строк из набора данных, теперь мне нужно объединить их в одну запись для каждой группы, и данные объединяются таким образом, чтобы у нас был максимально полный набор атрибутов. Пример:
а. если две повторяющиеся записи имеют общий адрес электронной почты, но только одна имеет полный почтовый адрес, то результирующая объединенная запись должна иметь как адрес электронной почты, так и почтовый адрес.
b. если две повторяющиеся записи имеют разные значения для одной из следующих записей, объединенная запись должна использовать более поздний атрибут, идентифицированный значениями временных меток ModifiedOn и/или CreatedOn.

Выборочные данные
ID	CreatedOn	ModifiedOn	Customer_LastName	Customer_FirstName	Customer_AddressLine1	Customer_City	Customer_State	Customer_Zip	Customer_HomePhone	Customer_InternetEmail
27196	2012-11-14 18:51:07.000	2012-11-17 15:28:45.000	NULL	David	98 Pelmor Dr	Marmora	OR	85044	NULL	NULL
14983	2012-11-18 14:02:44.000	2012-11-18 14:02:44.000	NULL	David	98 Pelmor Dr	Marmora	OR	85044	NULL	NULL


Что я уже пробовал:

Я не получаю подхода, с которого можно начать, поэтому мне нужна помощь в поиске наилучшего подхода.

Santosh kumar Pithani

Используйте функцию row_number() rank как ROw_number()over(partition by [Customer_LastName],
[Customer_FirstName],
[Customer_AddressLine1],
[Customer_InternetEmail],
[Customer_HomePhone] приказ по функции isnull(CreatedOn,createdon и modifiedon)) Как rn " в вашем запросе и более позднем фильтре с "где rn>=2"

Member 10183768

Извините, что я не знаю об этой функции, не могли бы вы помочь мне исправить это.

Выберите a.*, ROw_number()over(partition by a.[Customer_LastName],
а.[Customer_FirstName],
а.[Customer_AddressLine1],
а.[Customer_InternetEmail],
а.[Customer_HomePhone] приказ по функции isnull(CreatedOn,createdon и modifiedon)) Как РН
Из MRSVoid.ДБО.Customer_Dataset долларов
ПЕРЕКРЕСТНОЕ СОЕДИНЕНИЕ
(ВЫБИРАТЬ
[Customer_LastName]
,[Customer_FirstName]
,[Customer_AddressLine1]

,[Customer_HomePhone]
,[Customer_InternetEmail]
От MRSVoid.dbo.Customer_Dataset$
Группа по [Customer_LastName],
[Customer_FirstName],
[Customer_AddressLine1],
[Customer_InternetEmail],
[Customer_HomePhone]
Имея count(*) > 1) b
где ((а.Customer_LastName = б.Customer_LastName) или (А.Customer_LastName нуль И B.Customer_LastName имеет значение null))
И ((А.Customer_FirstName = б.Customer_FirstName) или (А.Customer_FirstName нуль И B.Customer_FirstName имеет значение null))
И ((А.Customer_AddressLine1 = б.Customer_AddressLine1) или (А.Customer_AddressLine1 нуль И B.Customer_AddressLine1 имеет значение null))
И ((А.Customer_InternetEmail = б.Customer_InternetEmail) или (А.Customer_InternetEmail нуль И B.Customer_InternetEmail имеет значение null))
И ((a.Customer_HomePhone = b.Customer_HomePhone) или (a.Customer_HomePhone равен нулю, А b.Customer_HomePhone равен нулю))

Santosh kumar Pithani

--Я не добавляю условие фильтра просто образец запроса нет необходимости группировать по
;С CTE В КАЧЕСТВЕ(
Выберите a.*, Count(1)over(partition by a.[Customer_LastName],
а.[Customer_FirstName],
а.[Customer_AddressLine1],
а.[Customer_InternetEmail],
а.[Customer_HomePhone] приказ по функции isnull(CreatedOn,createdon и modifiedon)) Как РН
Из MRSVoid.ДБО.Customer_Dataset долларов )
выберите Distinct * из CTE, где rn>=2

Richard Deeming

Репост
Вы уже опубликовали это сообщение:
https://www.codeproject.com/Questions/1277670/Help-me-de-duplicate-a-provided-dataset[^]

Если вы хотите обновить свой вопрос, чтобы добавить дополнительную информацию, перейдите к исходному вопросу и нажмите зеленую ссылку "улучшить вопрос". НЕ опубликуйте свое обновление как новый вопрос.

0 Ответов