如何在SQL中的弧/边集中识别组/簇?

cs0*_*815 6 sql teradata

我有像这些'有'的弧/边:

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.任何反馈都将非常感激.谢谢!

zar*_*ruq 2

假设所提供的示例数据不存在像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

希望这会有所帮助。