高效的 SQL 来计算共享从属关系的数量
Posted
技术标签:
【中文标题】高效的 SQL 来计算共享从属关系的数量【英文标题】:Efficient SQL to calculate # of shared affiliations 【发布时间】:2013-08-26 23:37:07 【问题描述】:所以我有
-
存储两个人之间不对称连接的表
(像 Twitter 关注;不像 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;
在 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 有 1 个共同的隶属关系 (C),2 和 5 有共同的 A,5 和 3 有共同的 B。 3和6没有共同点。同样 4 和 2。
【问题讨论】:
我总是建议发布表架构,如果您有示例数据和预期的输出,那将有很大帮助。 【参考方案1】:您可以通过聚合和右连接来做到这一点:
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;
加入会带来组。最后一个条件只在两个人之间引入匹配组。最后一组按计数。
【讨论】:
谢谢 - 将运行时间减半!以上是关于高效的 SQL 来计算共享从属关系的数量的主要内容,如果未能解决你的问题,请参考以下文章