SQL严格的集子集

时间:2017-01-05 22:14:05

标签: sql postgresql

我有一张代表图表的表格:

| FROM_ID | TO_ID |
-------------------
| 1       | 9     |
| 1       | 8     |
| 1       | 7     |
| 2       | 7     |
| 2       | 8     |
| 3       | 9     |
| 3       | 7     | 
| 4       | 6     |
| 4       | 8     | 

在实际例子中,有~5M行,其中~5k唯一FROM和~100k唯一TO

我想找到所有对(FROM_ID_X,FROM_ID_Y)s.t。每个FROM_ID的TO_ID集合是其他FROM_ID的严格超集。

所以在这个例子中我会得到: (1,2), (1,3)

为了更清楚: 每行代表图中的边。图中的每个节点都是类型A或类型B.一个类型A节点连接到一个或多个类型B节点。我想找到A类型的节点对。其中一个指向另一个的严格子集。

使用postgres fwiw

2 个答案:

答案 0 :(得分:0)

这是一种方法:

window.location.href = 'new-url-to-go-to';

答案 1 :(得分:0)

使用array_agg将to_id连接到一个数组中。此后self join此cte使用数组运算符<@检查一个数组是否是另一个数组的严格超集。

with concatenated_to as (
select from_id, array_agg(to_id) as arr_to
from t
group by from_id
)
select c1.from_id,c2.from_id 
from concatenated_to c1
join concatenated_to c2 on c1.from_id<>c2.from_id
where c2.arr_to <@ c1.arr_to

Sample Demo