1

ので、私は持っています

  1. 2 人の人物間の非対称なつながり ( Facebook の友達ではなく、Twitter のフォローのように) を格納するテーブルと、
  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