2016-12-05 1 views
1

Я пытаюсь сопоставить/объединить клиента, чтобы удалить дубликат в SQL.сопоставление слиянием клиента без инструментов

Я объясню небольшим примером. У меня есть таблица Customer, которая содержит имя, фамилию, ssn (не всегда заполняется) + номер телефона + адрес электронной почты.

Если у меня есть 3 правила, чтобы определить, дубликатом

same name,firstname,ssn 
same name,firstname,phone 
same name,firstname,email 

образец:

custid, firstname,lastname,ssn,phone 
1,billy,johns,null,020 6666 2222,null 
2,billy,johns,111-225,020 6666 2222,null 
3,billy,johns,111-225,020 6666 8888,[email protected] 
4,billy,johns,null,020 6666 1111,[email protected] 
5,eddy,barzoun,222-785,020 5252 5252 

Основываясь на правилах, клиент 1,2,3 и 4 одинаковы.

  • 1 и 2 матча на правиле номер телефона
  • 2 и 3 матча по правилу Ssn
  • 3 и 4 матча по правилу электронной
  • Клиент 5 один.

В принципе, для группировки по ssn, телефону и электронной почте я могу использовать аналитическую функцию sql или группу. Ниже результат:

custid, group_id_phon,group_id_ssn,group_id_email 
1,1,1,1 
2,1,2,2 
3,2,2,3 
4,3,3,3 
5,4,4,4 

Как я могу сделать, чтобы объединить 1,2, 3 и 4 в одном уникальном клиента. Я имею в виду, как я могу консолидировать (группировать) Клиента после применения правил. Я как бы застрял.

Я мог бы это:

6,billy,johns,null,null,[email protected] 
7,billy,johns,null,null,[email protected] 

Так 6 и 7 должны быть сгруппированы и не связаны с 1,2,3 и 4. Благодаря

ответ

1

Настройка Oracle:

CREATE TABLE table_name (id, first_name, last_name, ssn, phone, email) AS 
SELECT 1, 'a', 'a', null, 1111, null FROM DUAL UNION ALL 
SELECT 2, 'a', 'a', 1, 1111, null FROM DUAL UNION ALL 
SELECT 3, 'a', 'a', null, 2222, null FROM DUAL UNION ALL 
SELECT 4, 'a', 'a', 1, 2222, '[email protected]' FROM DUAL UNION ALL 
SELECT 5, 'a', 'a', null, null, '[email protected]' FROM DUAL UNION ALL 
SELECT 6, 'a', 'a', null, null, '[email protected]' FROM DUAL UNION ALL 
SELECT 7, 'a', 'a', null, null, '[email protected]' FROM DUAL UNION ALL 
SELECT 8, 'b', 'b', 3, 3333, null FROM DUAL; 

Вопрос:

SELECT id, 
     (
     SELECT MIN(id) 
     FROM table_name s 
     START WITH t.id = s.id 
     CONNECT BY NOCYCLE 
      PRIOR id <> id 
     AND PRIOR first_name = first_name 
     AND PRIOR last_name = last_name 
     AND (PRIOR ssn = ssn OR PRIOR phone = phone OR PRIOR email = email) 
     ) AS parent 
FROM table_name t 

Выход:

ID PARENT 
-- ------ 
1  1 
2  1 
3  1 
4  1 
5  1 
6  6 
7  6 
8  8 
+0

не мог даже думать о том, что делать – GurV

+0

mt0 не будет работы.Если увидеть, что я добавил. – Linus

+0

@ Linus Обновлен для вашего дополнительного тестового примера. – MT0

Смежные вопросы