Так что яЭффективное SQL для расчета # разделяемых принадлежности
- таблица, которая хранит асимметричные соединения между двумя людьми (как щебет следовать, не как другу Facebook) и
- за столом который хранит принадлежность лица к различным группам
Моя задача - найти для каждой асимметричной связи количество филиалов, разделяемых между «от лица» и «к людям» на".
Я сделал это решение грубой силы, но мне интересно, могли ли более яркие умы придумать что-то более эффективное.
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;
Использование ANSI SQL на Netezza (что не позволяет коррелировать подзапросы).
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 имеют 1 принадлежность в общей (С), 2 & 5 имеют в общем, 5 & 3 имеют B общего. 3 & 6 не имеют ничего общего. Точно так же 4 & 2.
Я бы всегда рекомендовал опубликовать схему таблиц, и если у вас есть образцы данных и ожидаемый результат, это поможет много. –