Вуаля;)
DECLARE @T TABLE
(
ID int NOT NULL, -- unique
StartEndFlag bit NULL, -- 0 - range start, 1 - range end
Msg nvarchar(260)
);
INSERT @T (ID, StartEndFlag, Msg) VALUES (1, NULL, N'1');
INSERT @T (ID, StartEndFlag, Msg) VALUES (2, 0, N'\');
INSERT @T (ID, StartEndFlag, Msg) VALUES (3, NULL, N'|1');
INSERT @T (ID, StartEndFlag, Msg) VALUES (4, NULL, N'|2');
INSERT @T (ID, StartEndFlag, Msg) VALUES (5, 0, N'|\');
INSERT @T (ID, StartEndFlag, Msg) VALUES (6, NULL, N'||1');
INSERT @T (ID, StartEndFlag, Msg) VALUES (7, 1, N'|/');
INSERT @T (ID, StartEndFlag, Msg) VALUES (8, 0, N'|\');
INSERT @T (ID, StartEndFlag, Msg) VALUES (9, 0, N'||\');
INSERT @T (ID, StartEndFlag, Msg) VALUES (10, 0, N'|||1');
INSERT @T (ID, StartEndFlag, Msg) VALUES (11, NULL, N'|||2');
INSERT @T (ID, StartEndFlag, Msg) VALUES (12, 0, N'|||\');
INSERT @T (ID, StartEndFlag, Msg) VALUES (13, NULL, N'||||1');
INSERT @T (ID, StartEndFlag, Msg) VALUES (14, 1, N'|||/')
INSERT @T (ID, StartEndFlag, Msg) VALUES (15, NULL, N'|||1');
INSERT @T (ID, StartEndFlag, Msg) VALUES (16, 1, N'||/');
INSERT @T (ID, StartEndFlag, Msg) VALUES (17, 1, N'|/');
INSERT @T (ID, StartEndFlag, Msg) VALUES (18, 1, N'/');
INSERT @T (ID, StartEndFlag, Msg) VALUES (19, 0, N'\');
INSERT @T (ID, StartEndFlag, Msg) VALUES (20, 1, N'/');
WITH Nested
AS
(
SELECT T1.ID, T1.Msg, T1.StartEndFlag, T2.StartCount - T3.EndCount AS NestingLevel
FROM @T T1
OUTER APPLY (
SELECT COUNT (T2.ID) AS StartCount
FROM @T T2 WHERE T1.ID > T2.ID AND T2.StartEndFlag = 0) AS T2
OUTER APPLY (
SELECT COUNT (T3.ID) AS EndCount
FROM @T T3 WHERE T1.ID > T3.ID AND T3.StartEndFlag = 1) AS T3
)
SELECT ID, Msg, Parent_ID, StartEndFlag FROM Nested N
OUTER APPLY (
SELECT MAX(ID) AS Parent_ID
FROM Nested N2
WHERE N2.ID < N.ID AND N2.NestingLevel = N.NestingLevel-1) AS N2;