获取前一行的ID,该ID不一定总是该行之前的静态行数?

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

我知道我的问题听起来很普通,但是如果不编写段落就无法在标题中指定所有详细信息。我将在这里尝试使其简单明了。

我有一个表格/有序表格项目的数据库表。每个表单项都可以缩进特定的“级别”。例如,缩进级别(IL)= 0的所有行都是该表单上的顶级项目。如果IL = 1,并且紧接在IL = 0行之后,则IL1行的父级将是先前的IL0行。但是,可以有X个IL1项,它们的父项都是以前的相同IL0。此模式可以继续向下进行6级嵌套(其中IL6的父级是先前的IL5)

这里是表格的示例,我手动填写了正确的ParentItemID(这是我要动态计算的列:]]

ItemID     FormID     SortOrder     Indent     Description          ParentItemID
1000       1          1             0          Main Item 1          NULL
1001       1          2             0          Main Item 2          NULL
1002       1          3             1          Sub Item 1           1001
1003       1          4             1          Sub Item 2           1001     
1004       1          5             2          Sub Item 2-1         1003
1005       1          6             2          Sub Item 2-2         1003
1006       1          7             2          Sub Item 2-3         1003
1007       1          8             3          Sub Item 2-3-1       1006
1008       1          9             1          Sub Item 3           1001
1009       1          10            0          Main Item 3          NULL

这是从数据库中的原始数据实际转换为表单时的外观,就像一个可视示例:

Form Example

我正在尝试使用LAG,它适用于第一个IL1项目,但是从那里开始,以下每个项目都指向上一行。我猜我可以运行大量更新,仅过滤到每个缩进级别,但这并不理想。我看到LAG接受了一个offset参数,但是由于某些原因,我无法绕开我如何动态地计算该值以始终引用缩进级别小于1的前一项(基于排序顺序)。当前的缩进级别。

这里是创建表并填充数据的SQL:

create table FormItems(
    ItemID int,     
    FormID int,
    SortOrder int,
    Indent int,
    Description nvarchar(100),
    ParentItemID int
    )

insert into FormItems
select 1000,       1,          1 ,            0,          'Main Item 1'          ,NULL union
select 1001,       1,          2 ,            0,          'Main Item 2'          ,NULL union
select 1002,       1,          3 ,            1,          'Sub Item 1'           ,1001 union
select 1003,       1,          4 ,            1,          'Sub Item 2'           ,1001 union     
select 1004,       1,          5 ,            2,          'Sub Item 2-1'         ,1003 union
select 1005,       1,          6 ,            2,          'Sub Item 2-2'         ,1003 union
select 1006,       1,          7 ,            2,          'Sub Item 2-3'         ,1003 union
select 1007,       1,          8 ,            3,          'Sub Item 2-3-1'       ,1006 union
select 1008,       1,          9 ,            1,          'Sub Item 3'           ,1001 union
select 1009,       1,          10,            0,          'Main Item 3'          ,NULL

我知道我的问题听起来很普通,但是如果不编写段落就无法在标题中指定所有详细信息。我将在这里尝试使其简单明了。我有一个表格的数据库表/ ...

sql database tsql hierarchy lag
1个回答
0
投票

可能是最简单的方法:

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