2017-04-13 18 views
0

我想壓縮表中的數據,使得在序列對中沒有冗餘,例如a,b與b,a相同。比較序列無關的對

具體來說,我想從表中可以得到: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 | 
+------+------+------+ 

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

在這裏,我只是想只選擇第一個關係,並丟棄反向關係作爲例如,如果A和B是得分爲0.8的朋友我想爲他們的關係保留一行作爲[A,B,0.8]而不是兩行,即[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

索引這是很酷的戈登!謝謝哥們 –