2016-12-22 4 views
2

背景 - 私は一連の顧客データを持っており、文字列照合アルゴリズムを使用して類似性をすべてのレコードで比較しています。お互いに関連する結果を直接または関連付けによってグループ化し、グループごとに一意のIDを適用する必要があります。文字列照合後のSQL Serverレコードリンケージ

問題 - 私は一緒にレコードをリンクするための方法を考えると、グループごとに固有のIDを適用することはできません

データが現在発見されている試合のために、このようになります。 (MatchScoreはここの問題とは関係ありませんが、データがどこから来たのかを示すためです)。

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

下位3レコードはすべてリンクされているため、同じIDを関連付けてもらいたいと考えています。

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 
を生成するためのコードのように見てみたいものです

私はレコードを一緒にリンクする方法を考えることができないと言うように、私はあらゆる種類の結合を試みたが、ユーレカの瞬間は決して来ない。どうぞお助けください。 DENSE_RANK()機能が提供されています:

おかげ

+3

下位3レコードが意味するものはリンクされていますか? 'CustomerID1'が複数の' CustomerId2'値とともにリストされているからです。なぜ、 'CustomerID1' 998328と998329が同じ' ID'値で終わるのですか? – Taryn

+0

その3つの別々のレコードは、顧客998328と2278386が一致するため、998328と998329が一致するため、998329と2278386が一致します。したがって、3つすべてが互いに一致することが示されているので、同じIDを取得してください。 – 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

注意を取得していますバージョン2012より

+0

あなたのtmpに別のレコードを追加した場合、CustomerID1として「774063」、CustomerID2として「774062」、MatchScoreとして「0.041」(またはID1とID2として774063)を選択すると、 IDが混乱しています... – Tyron78

+0

Tyron78が言ったことは真ですが、このアプローチはこの例では機能しますが、データの小さな変化は間違った結果をもたらすでしょう。私は良いセットベースのアプローチがあると確信していないが、もし私が1つを見つけるなら、私はここに戻って投稿する – DataPro

+0

@ Tyron78それは本当に良いキャッチです。私はそれに応じて私の答えを修正しました。 – Viki888