我有像这些'有'的弧/边:
Node1 Node2
A B
B C
D E
Run Code Online (Sandbox Code Playgroud)
这里A连接到B和B连接到C.D连接到E.换句话说,这些'想要'中显示了2个组/簇:
Node1 Node2 Cluster
A B 1
B C 1
D E 2
Run Code Online (Sandbox Code Playgroud)
我可以使用SQL来识别这些组/集群吗?我想这涉及自联接,但我看不出如何编写这个SQL.任何反馈都将非常感激.谢谢!
假设所提供的示例数据不存在像A->B->C->A数据中那样的循环,以下是将从表中返回所需输出的查询nodes。
WITH RECURSIVE NodeCluster (node1,node2,Cluster1) AS
(SELECT node1,
node2,
Rank() Over (
ORDER BY node1)
FROM nodes AS n1
WHERE NOT EXISTS
(SELECT *
FROM nodes AS n2
WHERE n1.node1 = n2.node2)
UNION ALL SELECT N1.node1,
N1.node2,
NodeCluster.Cluster1
FROM nodes n1,
NodeCluster
WHERE NodeCluster.node2=n1.node1 )
SELECT *
FROM NodeCluster
ORDER BY Cluster1,
node1,
node2;
Run Code Online (Sandbox Code Playgroud)
在种子查询中,选择所有起始节点并按ranked升序asc将簇编号分配给数据。
根据所提供的数据,以下是输出。
Node1 | Node2 | Cluster1
-------------------------
A B 1
B C 1
D E 2
Run Code Online (Sandbox Code Playgroud)
为了再次保证,更多数据已添加到示例数据中,如下所示。
Node1 | Node2
-------------
A B
B C
D E
E F
F G
H I
I J
J K
L M
Run Code Online (Sandbox Code Playgroud)
查询产生以下输出。
Node1 | Node2 | Cluster1
-------------------------
A B 1
B C 1
D E 2
E F 2
F G 2
H I 3
I J 3
J K 3
L M 4
Run Code Online (Sandbox Code Playgroud)
解决方案查询已在Teradata SQL Assistant和模式下成功测试。bteqteradataANSI
希望这会有所帮助。