将连续的行分组为两列

Grouping Contiguous Rows in two Columns

我有一个 table,其中有两行 From_ID 和 To_ID。我需要基于具有相同 Work_ID 的行进行分组并且分组应该从 From_ID 开始并且应该采用它的 To_ID 并查找具有 From_ID 的行作为 To_ID 那一行。这些不能按顺序排列。并且仅当没有 From_ID 为 To_ID 的行时,该组才应该结束。我认为 table 定义和屏幕截图将清除我的查询。

CREATE TABLE [dbo].[tblttt](
[ID] [bigint] IDENTITY(1,1) NOT NULL,
[Work_ID] [nvarchar](max) NULL,
[From_ID] [int] NULL,
[To_ID] [int] NULL,
[Share] [float] NULL,
CONSTRAINT [PK_tblttt] PRIMARY KEY CLUSTERED 
(
   [ID] ASC
))
GO
SET IDENTITY_INSERT [dbo].[tblttt] ON 
GO
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (1, N'051111Clus', 30500004, 30500005, 0.025)
GO
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (2, N'051111Clus', 30500004, 30500007, 0.025)
GO
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (3, N'051111Clus', 30500004, 30500009, 0.25)
GO
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (4, N'051111Clus', 30500004, 30500027, 0.025)
GO
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (5, N'051111Clus', 30500004, 30500029, 0.45)
GO
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (6, N'051111Clus', 30500005, 30500006, 1)
GO
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (7, N'051111Clus', 30500007, 30500008, 1)
GO
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (8, N'051111Clus', 30500009, 30500010, 0.6)
GO
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (9, N'051111Clus', 30500009, 30500024, 0.4)
GO
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (10, N'051111Clus', 30500010, 30500011, 0.33333333333333331)
GO
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (11, N'051111Clus', 30500010, 30500017, 0.666666666666667)
GO
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (12, N'051111Clus', 30500011, 30500012, 1)
GO
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (13, N'051111Clus', 30500012, 30601745, 1)
GO
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (14, N'051111Clus', 30500013, 30500014, 1)
GO
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (15, N'051111Clus', 30500015, 30500016, 1)
GO
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (16, N'051111Clus', 30500017, 30601746, 1)
GO
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (17, N'051111Clus', 30500018, 30500019, 0.66666666666666663)
GO
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (18, N'051111Clus', 30500021, 30500022, 1)
GO
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (19, N'051111Clus', 30500022, 30500023, 1)
GO
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (20, N'051111Clus', 30500024, 30500025, 1)
GO
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (21, N'051111Clus', 30500025, 30500026, 0.5)
GO
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (22, N'051111Clus', 30500027, 30601747, 1)
GO
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (23, N'051111Clus', 30500029, 30500030, 0.5)
GO
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (24, N'051111Clus', 30601745, 30500013, 0.5)
GO
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (25, N'051111Clus', 30601745, 30500015, 0.5)
GO
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (26, N'051111Clus', 30601746, 30500018, 0.75)
GO
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (27, N'051111Clus', 30601746, 30500021, 0.25)
GO
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (28, N'051111Clus', 30601747, 30500028, 1)
GO
SET IDENTITY_INSERT [dbo].[tblttt] OFF
GO

输出是这样的:

从屏幕截图中可以清楚地看出,第一组的 From_ID 为 30500004,To_ID 为 30500005。share 的值应为 1,因为该组的第一行。该组中的下一个条目将是 From_ID 为 30500005 和 To_ID 为 30500006 的行,并且与该行的 1 共享相同。现在,由于没有 From_ID 为 30500006 的行,该组只会结束,新组将再次开始 From_ID 为 30500004 和 To_ID 为 30500007。

我试过跟随,但没有满足我的要求:

SELECT
TR.*
FROM tbltttT
LEFT JOIN tblttt TR
ON T.From_ID = TR.To_ID
WHERE T.work_id = '051111Clus' AND TR.work_id = '051111Clus'

那么我该如何实现呢?

我通过循环而不是递归查询解决了这个问题,从所有叶节点开始,然后到它们的父节点直到顶部节点。