2017-04-13 10 views
0

ペアのシーケンスに関して冗長性がないように、テーブル内のデータを圧縮する必要があります。たとえば、bはb、aと同じです。シーケンスが関係ないペアの比較

具体的に、私はテーブルから取得したい:

+------+------+------+ 
| p1 | p2 | score | 
+------+------+------+ 
| a | b | 0.8 | 
| a | c | 0.67 | 
| a | d | 0.89 | 
| a | e | 0.47 | 
+------+------+------+ 

にredundant_relations

+------+------+------+ 
| p1 | p2 | score| 
+------+------+------+ 
| a | b | 0.8 | 
| a | c | 0.67 | 
| b | a | 0.8 | 
| c | a | 0.67 | 
| a | d | 0.89 | 
| a | e | 0.47 | 
| d | a | 0.89 | 
| e | a | 0.47 | 
+------+------+------+ 

は、ここで私はちょうど最初の関係を選択して、AとBがある場合などのように逆の関係を破棄したいですスコア0.8の友達私は[A、B、0.8]という2つの行ではなく、[A、B、0.8]と[B、A、0.8]というように、これらの関係は存在し、後のものを削除したい。

ありがとうございます。

答えて

1

あなたはすべてのペアを持って知っている場合は、単に実行します。スコアが同じでない場合は関係がすべてのペアされているかどうか

select rr.* 
from redundant_relations rr 
where rr.p1 < rr.p2; 

は、これは、より複雑になります。その場合、私は(p1, p2, score)のインデックスを提案します:

select rr.* 
from redundant_relations rr 
where rr.p1 < rr.p2 
union all 
select rr.* 
from redundant_relations rr 
where rr.p1 > rr.p2 and 
     not exists (select 1 
        from redundant_relations rr2 
        where rr2.p1 = rr.p2 and rr2.p2 = rr.p1 and rr2.score = rr.score 
       ); 
+0

それはクールなゴードンです!ありがとう –

関連する問題