我们有来自上游的以下数据:-
child. Parent
2. 1
3. 1
14. 1
1. 4
5. 1
6. 7
8. 7
13. 8
12. 8
8. 13
9. 10
10. 11
有时,孩子出现在父母中,反之亦然,没有固定的顺序,关系也可以是循环的。
预期的输出是
child. group
1. 1
2. 1
3. 1
4. 1
5. 1
6. 1
7. 1
8. 1
12. 1
13. 1
9. 10
10. 10
11. 10
有人可以提出可能的解决方案,我已经尝试过定向sql,但是循环关系被排除在外
请提出建议
周期让这很痛苦。一种方法是将已访问的值存储在字符串中。因此,我们的想法是获取每个可能的匹配值,然后进行汇总-最小匹配是“组”的良好描述符:
with recursive cp as (
select child as node1, child as node2
from t
union -- remove duplicates
select parent, parent
from t
),
cte as (
select node1, node2, '|' || node1 || '|' as nodes
from cp
union all
select cte.node1, cp.node2, cte.nodes || cte.node1 || '|'
from cte join
cp
on cp.node2 = cte.node1
where cte.nodes not like '%|' || cp.node1 || '|%'
)
select cte.node1, min(cte.node2)
from cte
group by cte.node1;