2016-12-22 4 views
2

Фон - У меня есть набор данных о клиентах и ​​используется алгоритм сопоставления строк для сравнения всех записей для сходства. Затем мне нужно сгруппировать результаты, которые связаны друг с другом либо напрямую, либо путем ассоциации, и применять уникальный идентификатор для каждой группы.Запись SQL Server после привязки строк

Проблема - Я не могу придумать способ, чтобы связать записи вместе и применить уникальный идентификатор для каждой группы

Примера

данные в настоящее время выглядит следующим образом для матчей, которые были найдены (MatchScore не относится к проблеме здесь, а демонстрирует, откуда взялись данные).

Все 3 записи связаны друг с другом, поэтому я хочу, чтобы они имели одинаковый идентификатор.

visual image of these records all being related

Это то, что я хочу, чтобы данные выглядеть

+----+-------------+-------------+------------+ 
| ID | CustomerID1 | CustomerID2 | MatchScore | 
+----+-------------+-------------+------------+ 
| 1 |  998328 |  2278386 | 0.063  | 
| 1 |  998328 |  998329 | 0.058  | 
| 1 |  998329 |  2278386 | 0.030  | 
| 2 |  2021000 |  2707799 | 0.075  | 
| 2 |  2021000 |  3856308 | 0.082  | 
| 3 |  774062 |  774063 | 0.041  | 
+----+-------------+-------------+------------+ 

или аналогично

+----+------------+ 
| ID | CustomerID | 
+----+------------+ 
| 1 | 2278386 | 
| 1 |  998328 | 
| 1 |  998329 | 
| 2 | 2021000 | 
| 2 | 2707799 | 
| 2 | 3856308 | 
| 3 |  774062 | 
| 3 |  774063 | 
+----+------------+ 

кода для создания Пример таблицы

select '998328' as CustomerID1,'998329' as CustomerID2,'0.058' as MatchScore 
into #tmp 
union 
select '998328' as CustomerID1,'2278386' as CustomerID2,'0.063' as MatchScore 
union 
select '998329' as CustomerID1,'2278386' as CustomerID2,'0.030' as MatchScore 
union 
select '2021000' as CustomerID1,'2707799' as CustomerID2,'0.075' as MatchScore 
union 
select '2021000' as CustomerID1,'3856308' as CustomerID2,'0.082' as MatchScore 
union 
select '774062' as CustomerID1,'774063' as CustomerID2,'0.041' as MatchScore 

select * from #tmp 

Как я уже сказал, я не могу подумать, как связать записи вместе, я пробовал всевозможные объединения, но момент эврики никогда не приходит. Пожалуйста, помогите.

Благодаря

+3

Что вы подразумеваете под нижними 3 записями? Связаны ли они только потому, что «CustomerID1» указан с несколькими значениями «CustomerId2»? И почему «CustomerID1» 998328 и 998329 имеют одинаковое значение «ID»? – Taryn

+0

его, потому что 3 отдельные записи означают, что игроки 998328 и 2278386 соответствуют, 998328 и 998329 матчам, 998329 и 2278386 матчам. Поэтому показано, что все 3 соответствуют друг другу, поэтому получите одинаковый идентификатор. – DataPro

ответ

1

Я не уверен, что это результат, который вы ожидаете,

with tmp as(
select '998328' as CustomerID1,'998329' as CustomerID2,'0.058' as MatchScore 
union 
select '998328' as CustomerID1,'2278386' as CustomerID2,'0.063' as MatchScore 
union 
select '998329' as CustomerID1,'2278386' as CustomerID2,'0.030' as MatchScore 
union 
select '2021000' as CustomerID1,'2707799' as CustomerID2,'0.075' as MatchScore 
union 
select '2021000' as CustomerID1,'3856308' as CustomerID2,'0.082' as MatchScore 
union 
select '774062' as CustomerID1,'774063' as CustomerID2,'0.041' as MatchScore 
union 
select '774063' as CustomerID1,'774062' as CustomerID2,'0.041' as MatchScore 
union 
select '774063' as CustomerID1,'774063' as CustomerID2,'0.041' as MatchScore) 


select DENSE_RANK() OVER(ORDER BY rank_value) id, t1.CustomerID1, t1.CustomerID2 
from(
    select 
     t1.*, 
     case 
      when t2.CustomerID1 IS NOT NULL 
       THEN t2.CustomerID1 
      ELSE t3.CustomerID1 
     end rank_value 

    from tmp t1 
    left join tmp t2 
    on (t1.CustomerID1 = t2.CustomerID2 
      and t1.CustomerID2!=t2.CustomerID1 
      and (t1.CustomerID1 != t1.CustomerID2 and t2.CustomerID1 != t2.CustomerID2)) 
     or (t1.CustomerID1 = t2.CustomerID1 
      and t1.CustomerID2 != t2.CustomerID2 
      and (t1.CustomerID1 != t1.CustomerID2)) 
    left join tmp t3 
     on t1.CustomerID1 = t3.CustomerID2 
      and t1.CustomerID2=t3.CustomerID1 
)t1 

Я получаю результат ниже

enter image description here

Примечание: DENSE_RANK() функция доступна от версии 2012

+0

Приятный подход, но я думаю, что это немного багги: если вы добавите еще одну запись в ваш tmp «выберите« 774063 »в качестве CustomerID1,« 774062 »в качестве CustomerID2,« 0.041 »в качестве MatchScore» (или 774063 как ID1 и ID2) идентификаторы перепутаны ... – Tyron78

+0

Что говорит Tyron78, этот подход работает для этого примера, но небольшое изменение в данных даст неправильные результаты. Я не уверен, что есть хороший подход на основе набора, но если я найду его, я отправлю его сюда – DataPro

+0

@ Tyron78 ​​Это действительно хороший улов. Я изменил свой ответ, соответственно, чтобы добиться этого. – Viki888

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

  • Нет связанных вопросов^_^