2013-08-26 2 views
1

Так что яЭффективное SQL для расчета # разделяемых принадлежности

  1. таблица, которая хранит асимметричные соединения между двумя людьми (как щебет следовать, не как другу 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; 

Использование 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.

+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

Смежные вопросы