在分层数据中创建腿列

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

我正在尝试在 Select 语句中添加一列,该列可以将腿编号分配给我拥有的三个腿。支线编号始终分配在 1 级,没有特定的顺序。

注意:我的实际数据是随机的6位ID,而不是编号1,2,3,4...

Visual Tree

数据:

declare @mytable table(id int, parent_id int, level int)

INSERT INTO @MYTABLE VALUES(1, NULL, 0) 
INSERT INTO @MYTABLE VALUES(2, 1, 1) 
INSERT INTO @MYTABLE VALUES(3, 1, 1)
INSERT INTO @MYTABLE VALUES(4, 1, 1) 
INSERT INTO @MYTABLE VALUES(5, 2, 2)
INSERT INTO @MYTABLE VALUES(6, 2, 2) 
INSERT INTO @MYTABLE VALUES(7, 4, 2)
INSERT INTO @MYTABLE VALUES(8, 4, 2) 
INSERT INTO @MYTABLE VALUES(9, 4, 2)
INSERT INTO @MYTABLE VALUES(10, 4, 2) 
INSERT INTO @MYTABLE VALUES(11, 6, 3)
INSERT INTO @MYTABLE VALUES(12, 6, 3) 
INSERT INTO @MYTABLE VALUES(13, 12, 4)
INSERT INTO @MYTABLE VALUES(14, 12, 4) 
INSERT INTO @MYTABLE VALUES(15, 12, 4)
INSERT INTO @MYTABLE VALUES(16, 10, 3) 
INSERT INTO @MYTABLE VALUES(17, 10, 3)
INSERT INTO @MYTABLE VALUES(18, 10, 3) 
INSERT INTO @MYTABLE VALUES(19, 13, 5)
INSERT INTO @MYTABLE VALUES(20, 13, 5) 
INSERT INTO @MYTABLE VALUES(21, 13, 5)
INSERT INTO @MYTABLE VALUES(22, 17, 4) 
INSERT INTO @MYTABLE VALUES(23, 17, 4)
;
    select 
        b.id, 
        b.parent_id,
    b.level
      
    from @mytable b 

Desired Result

sql parent-child hierarchical-data
1个回答
0
投票

很好的挑战。给你!

WITH cte AS
(
    SELECT  m.id
            ,m.parent_id
            ,0 AS Lev
            ,CAST(NULL AS BIGINT) AS Leg
    FROM    @mytable AS m
    WHERE   m.parent_id IS NULL
    UNION ALL
    SELECT  cc.id
            ,cc.parent_id
            ,c.Lev + 1
            ,CASE
                      WHEN c.Lev + 1 = 1 THEN ROW_NUMBER() OVER (ORDER BY c.Lev + 1)
                      ELSE c.Leg
                  END AS Leg
    FROM    cte AS c
            INNER JOIN @mytable AS cc ON cc.parent_id = c.id
)
SELECT  cte.id
        ,cte.parent_id
        ,cte.Lev
        ,cte.Leg
FROM    cte
ORDER BY cte.id
© www.soinside.com 2019 - 2024. All rights reserved.