2013-08-26 25 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