1

所以我有

  1. 存储两个人之间不对称连接的表(如 Twitter 关注;不像Facebook 朋友)和
  2. 存储一个人与各个组的从属关系的表

我的任务是为每个不对称关系找出“发件人”和“发件人”之间共享的从属关系数。

我做了这个蛮力解决方案,但我想知道更聪明的头脑是否能想出更有效的东西。

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(不允许关联子查询)。

蒂亚!

编辑添加表模式:

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 有 1 个共同的从属关系 (C),2 和 5 有共同的 A,5 和 3 有共同的 B。3和6没有共同点。同样 4 和 2。

4

1 回答 1

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;

加入会引入组。最后一个条件只在两个人之间引入匹配组。最后一组按计数。

于 2013-08-27T00:21:58.293 回答