高效的 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 来计算共享从属关系的数量的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 高效SQL

宣布 ScaNN:高效的向量相似性搜索

风起云涌看SaaS

SAP 物料清单 BOM

如何解决:关系约束中的从属角色和主要角色中的属性数量必须相同?

实体框架代码优先:关系约束中的从属角色和主体角色中的属性数量必须相同