2013-08-26 50 views
1
的#

所以我有效的SQL計算共享的隸屬關係

  1. 存儲兩個人 之間的非對稱連接的表(如Twitter關注; 像Facebook好友)和
  2. 表存儲一個人的加入各個羣體

我的任務是找到,爲每個不對稱的關係,從「人」和「人」之間共享affiliations數量上」。

我做了這個蠻力解決方案,但我想知道是否更明亮的頭腦可以拿出更有效的東西。

select frm01.from_person_id, frm01.to_person_id, count(*) num_affl 
from 
(
    select lnk.from_person_id, lnk.to_person_id, ga.grp_id from_grp_id 
    from links lnk 
    left outer join grp_affl ga on lnk.from_person_id = ga.person_id 
    group by lnk.from_person_id, lnk.to_person_id, grp_id 
) frm01 
inner join 
(
    select lnk.from_person_id, lnk.to_person_id, ga.grp_id to_grp_id 
    from links lnk 
    left outer join grp_affl ga on lnk.to_person_id = ga.person_id 
    group by lnk.from_person_id, lnk.to_person_id, grp_id 
) to01 
on (
    frm01.from_person_id = to01.from_person_id 
    and frm01.to_person_id = to01.to_person_id 
    and frm01.from_grp_id = to01.to_grp_id 
    ) 
group by frm01.from_person_id, frm01.to_person_id; 

在Netezza上使用ANSI SQL(不允許相關的子查詢)。

TIA!

編輯補充表模式:

table lnk: 
from_person_id to_person_id 
1    4 
2    5 
3    6 
4    2 
5    3 


table grp_affl: 
person_id grp_id 
1   A 
1   B 
1   C 
2   A 
3   B 
4   C 
5   A 
5   B 
5   C 
6   A 

expected output: 
from_person_id to_person_id num_affl 
1    4    1 
2    5    1 
3    6    0 
4    2    0 
5    3    1 

人數1 & 4具有共同(C)1個從屬關係,2 & 5具有甲共同點,5 & 3具有乙共同之處。 3沒有任何共同之處。同樣4 & 2.

+0

我總是建議發佈表架構,如果你有樣本數據和你的預期輸出那麼這將有很大的幫助。 –

回答

3

你可以用聚集做到這一點,正確的連接:

select pairs.from_person, pairs.to_person, count(*) 
from links pairs join 
    grp_affil fromga 
    on fromga.person_id = pairs.from_person join 
    grp_affil toga 
    on toga.person_id = pairs.to_person and 
     toga.grp_id = fromga.grp_id 
group by pairs.from_person, pairs.to_person; 

的加入帶來的羣體。最後一個條件只會引入兩個人之間的匹配組。最後一組通過計數。

+0

謝謝 - 將運行時間減半! – SQLCurious