考虑 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()
中,但我看不到合理的分区依据和排序依据语句。数据集可以是一对多。
似乎您需要在递归 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);