Tsql SQL查询-从级别和子索引获取父索引

Tsql SQL查询-从级别和子索引获取父索引,tsql,ado,Tsql,Ado,我有两列数据集:索引和级别 级别是表示嵌套父子记录层次结构中的级别的数字 记录是按层次结构排列的,索引只是记录的行号 规则是,任何记录的父记录都具有级别=子级别-1 Index,Level Number,Parent Level,Parent Index 1,1,1,1 2,2,1,1 4,4,3,3 9,9,8,8 3,3,2,2 5,5,4,4 8,8,7,7 6,6,5,5 7,7,6,6 10,10,9,9 11,11,10,10 12,12,11,11 13,13,12,12 14,1

我有两列数据集:索引和级别

级别是表示嵌套父子记录层次结构中的级别的数字

记录是按层次结构排列的,索引只是记录的行号

规则是,任何记录的父记录都具有级别=子级别-1

Index,Level Number,Parent Level,Parent Index
1,1,1,1
2,2,1,1
4,4,3,3
9,9,8,8
3,3,2,2
5,5,4,4
8,8,7,7
6,6,5,5
7,7,6,6
10,10,9,9
11,11,10,10
12,12,11,11
13,13,12,12
14,14,13,13
15,14,13,13
16,14,13,13
17,14,13,13
18,14,13,13
19,14,13,13
20,14,13,13
21,13,12,12
22,13,12,12
23,13,12,12
24,14,13,23
25,14,13,23
26,14,13,23
27,11,10,10
28,9,8,8
29,9,8,8
30,9,8,8
31,9,8,8
32,9,8,8
33,9,8,8
34,9,8,8
35,8,7,7
36,9,8,35
37,10,9,36
38,11,10,37
39,11,10,37
40,12,11,39
41,12,11,39
42,13,12,41
43,13,12,41
44,13,12,41
45,11,10,37
46,12,11,45
47,13,12,46
48,14,13,47
49,14,13,47
50,14,13,47
51,14,13,47
52,14,13,47
53,14,13,47
54,14,13,47
55,13,12,46
56,13,12,46
57,13,12,46
58,9,8,35
59,9,8,35
60,9,8,35
61,9,8,35
62,8,7,7
63,8,7,7
64,8,7,7
65,8,7,7
66,8,7,7
67,8,7,7
68,8,7,7
我的挑战是根据这条规则识别父项的索引

对于每个记录,我需要使用SQL查询来获取记录的父索引

SQL查询将是一个自联接,并获取最大索引值,其中自联接索引 我需要帮助来找出如何编写这个SQL

我可以使用MS Access或VBA中的SQL来执行此查询

这是数据集的可视化表示

这是示例数据和预期结果。。要获取父索引。。父级为子级-1

Index,Level Number,Parent Level,Parent Index
1,1,1,1
2,2,1,1
4,4,3,3
9,9,8,8
3,3,2,2
5,5,4,4
8,8,7,7
6,6,5,5
7,7,6,6
10,10,9,9
11,11,10,10
12,12,11,11
13,13,12,12
14,14,13,13
15,14,13,13
16,14,13,13
17,14,13,13
18,14,13,13
19,14,13,13
20,14,13,13
21,13,12,12
22,13,12,12
23,13,12,12
24,14,13,23
25,14,13,23
26,14,13,23
27,11,10,10
28,9,8,8
29,9,8,8
30,9,8,8
31,9,8,8
32,9,8,8
33,9,8,8
34,9,8,8
35,8,7,7
36,9,8,35
37,10,9,36
38,11,10,37
39,11,10,37
40,12,11,39
41,12,11,39
42,13,12,41
43,13,12,41
44,13,12,41
45,11,10,37
46,12,11,45
47,13,12,46
48,14,13,47
49,14,13,47
50,14,13,47
51,14,13,47
52,14,13,47
53,14,13,47
54,14,13,47
55,13,12,46
56,13,12,46
57,13,12,46
58,9,8,35
59,9,8,35
60,9,8,35
61,9,8,35
62,8,7,7
63,8,7,7
64,8,7,7
65,8,7,7
66,8,7,7
67,8,7,7
68,8,7,7
编辑以添加: 我尝试在Excel Power Query中执行此操作,并找到了一个答案,但它需要永远运行,因此需要找到SQL VBA/ADO解决方案。但这里有一个powerquery解决方案,可以帮助您了解如何使用SQL进行查询

let
    Source = Excel.CurrentWorkbook(){[Name="Tabelle3"]}[Content],
    ParentIndex = Table.AddColumn(Source, "ParentIndex", each let Index=[Index], LN=[Level Number] in List.Max(Table.SelectRows(Source, each _[Index] < Index and _[Level Number]=LN-1)[Index])),
    #"Merged Queries" = Table.NestedJoin(ParentIndex,{"ParentIndex"},ParentIndex,{"Index"},"NewColumn",JoinKind.LeftOuter),
    #"Expanded NewColumn" = Table.ExpandTableColumn(#"Merged Queries", "NewColumn", {"Level Number"}, {"Level Number.1"})
in
    #"Expanded NewColumn" 
let
Source=Excel.CurrentWorkbook(){[Name=“Tabelle3”]}[Content],
ParentIndex=Table.AddColumn(源,“ParentIndex”,List.Max中的每个let Index=[Index],LN=[Level Number](表.SelectRows(源,每个[Index]
此Power查询解决方案查找最大索引,其中每行索引<所有索引,级别=级别-1

DECLARE @t TABLE (val INT)
INSERT INTO @t
VALUES 
    (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),
    (14),(14),(14),(14),(14),(14),(14),(13),(13),(13),(14),(14),(14),(11)

SELECT REPLICATE(' ', val) + CAST(val AS VARCHAR(10))
FROM @t
输出

-----------------------------
 1
  2
   3
    4
     5
      6
       7
        8
         9
          10
           11
            12
             13
              14
              14
              14
              14
              14
              14
              14
             13
             13
输出

-----------------------------
 1
  2
   3
    4
     5
      6
       7
        8
         9
          10
           11
            12
             13
              14
              14
              14
              14
              14
              14
              14
             13
             13


一些样本和预期结果将有助于提供样本数据和预期结果。请不要将数据作为图像包含在内。我们必须重新键入它。。。请将您的数据添加到可粘贴的文本中。最好是一个带有
CREATE TABLE
和一些
INSERT-in
语句的测试场景。你会得到更多好的答案…添加了一些数据和预期的结果,因为csvThis使用sql server和ms access标记。在VBA中编写SQL或SQL的更多信息。。。您的VBA代码是否在使用SQL Server?哪一个是正确的?请说明版本!一些样本和预期结果将有助于提供样本数据和预期结果。请不要将数据作为图像包含在内。我们必须重新键入它。。。请将您的数据添加到可粘贴的文本中。最好是一个带有
CREATE TABLE
和一些
INSERT-in
语句的测试场景。你会得到更多好的答案…添加了一些数据和预期的结果,因为csvThis使用sql server和ms access标记。在VBA中编写SQL或SQL的更多信息。。。您的VBA代码是否在使用SQL Server?哪一个是正确的?请说明版本!我确实要求TSQL,所以得到了我要求的。它在SQL Server上运行得很好,但在一个新问题中发现TSQL窗口功能(例如分区上的TSQL窗口功能)无法使用Jet/ACE SQL。您是否有兴趣在那里修改Jet/ACE SQL的SQL?只是取消了答案检查。他仔细看了看。这并没有得到预期的结果。这些SQL结果在索引24之前都是正确的。索引24父索引应该是23而不是13。分组在层次结构中查找的最小值太远。索引24的样本数据是24,13,这应该是24,24吗?样本数据应该是24,14,我确实要求了TSQL,所以得到了我要求的。它在SQL Server上运行得很好,但在一个新问题中发现TSQL窗口功能(例如分区上的TSQL窗口功能)无法使用Jet/ACE SQL。您是否有兴趣在那里修改Jet/ACE SQL的SQL?只是取消了答案检查。他仔细看了看。这并没有得到预期的结果。这些SQL结果在索引24之前都是正确的。索引24父索引应该是23而不是13。分组在层次结构中查找的最小值太远。索引24的样本数据为24,13,是否应为24,24?样本数据应为24,14