基于链接行创建表排序

问题描述 投票:0回答:1

考虑 SQL Server 中的下表。

我们正在尝试创建一个

Row_ID
/基于
Network_Route_ID
的排序。

Route_id
A(对象 1)永远不会连接到表中的任何内容,并锚定为第 1 行。

对象1将始终链接到对象2(通过B),对象2将链接到对象3(通过C),依此类推...

对象_ID 网络_路由_ID 行_id
对象1 A 1
对象1 B -
对象2 C -
对象3 D -
对象2 B -
对象3 C -

所需输出:

对象_ID 网络_路由_ID 行_id
对象1 A 1
对象1 B 2
对象2 B 3
对象2 C 4
对象3 C 5
对象3 D 6

到目前为止我尝试过的:

Select *  
from #table as main
left join #table as oppo on (main.Network_Route_ID = oppo.Network_Route_ID ) 
                         and (main.Object_ID <> oppo.Object_ID)

因为我不太熟悉 CTE。上面的内容将作为辅助列输入到

lag()
中,但我看不到合理的分区依据和排序依据语句。数据集可以是一对多。

sql sql-server tsql
1个回答
0
投票

似乎您需要在递归 CTE 中进行双重连接,才能连接每组的第一行和第二行。

然后你在最后取消旋转。

WITH cte AS (
    SELECT
      t1.Object_ID,
      Network1 = t1.Network_Route_ID,
      Network2 = t2.Network_Route_ID,
      RowId = 2
    FROM YourTable t1
    JOIN YourTable t2
      ON t2.Object_ID = t1.Object_ID
     AND t2.Network_Route_ID <> t1.Network_Route_ID
    WHERE t1.Object_ID = 'Object1'
      AND t1.Network_Route_ID = 'A'

    UNION ALL

    SELECT
      t1.Object_ID,
      t1.Network_Route_ID,
      t2.Network_Route_ID,
      RowId = cte.RowId + 2
    FROM cte
    JOIN YourTable t1
      ON t1.Network_Route_ID = cte.Network2
     AND t1.Object_ID <> cte.Object_ID
    JOIN YourTable t2
      ON t2.Object_ID = t1.Object_ID
     AND t2.Network_Route_ID <> t1.Network_Route_ID
)
SELECT
  cte.Object_ID,
  v.*
FROM cte
CROSS APPLY (VALUES
    (Network1, RowId - 1),
    (Network2, RowId)
) v(Network_Route_ID, Row_ID);

db<>小提琴

© www.soinside.com 2019 - 2024. All rights reserved.