2016-04-15 148 views
0

我有两列数据集:索引和级别。SQL查询 - 从级别和子索引获取父索引

级别是指示嵌套父级子记录层级中的级别的数字。

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

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

我的挑战是在此基础上的规则,以确定父母的指数。

对于每条记录,我需要SQL查询来获取记录的父索引。

的SQL查询将是自加盟,并获得最大的索引值当自己连接索引< child.index和自联接水平= child.level

我需要帮助弄清楚如何写这个SQL。

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

这是数据集的可视表示。

enter image description here

这是样本数据和预期的结果..想父索引..父级是子级 - 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解决方案。但是这里是Power Query解决方案,以帮助提供有关如何执行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" 

这是功率查询溶液发现最大索引,其中每个行索引<所有索引和水平=水平-1

+0

随着预期的结果的一些示例将有助于 – TheGameiswar

+0

请提供样本数据和预期结果。 –

+0

请不要将数据包含为图像。我们将不得不重新输入它...请添加您的数据一个副本'''可调整的文本。最好的方法是使用“CREATE TABLE”和一些“INSERT INTO”语句的测试场景。你会得到更多的好答案... – Shnugo

回答

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
--http://stackoverflow.com/questions/36639349/sql-query-get-parent-index-from-level-and-child-index 
declare @table table 
(idx int, level int) 

insert into @table 
(idx,level) 
values 
(1,1), 
(2,2), 
(3,3), 
(4,4), 
(5,5), 
(6,6), 
(7,7), 
(8,8), 
(9,9), 
(10,10), 
(11,11), 
(12,12), 
(13,13), 
(14,14), 
(15,14), 
(16,14), 
(17,14), 
(18,14), 
(19,14), 
(20,14), 
(21,14), 
(22,13), 
(23,13), 
(24,13), 
(25,14), 
(26,14), 
(27,14), 
(28,11), 
(29,9), 
(30,8) 

select v.idx,v.level,v.parentlevel,u.idx parentidx 
from 
(
select s.* from        --Find the first idx,level 
(
select t.*, t.level - 1 as parentlevel, 
     row_number() over (partition by level order by idx,level) rownum 
from @table t 
) s 
where rownum = 1 
) u 
join          --join to every occurance of 
(select t2.*, t2.level - 1 parentlevel, 
     1 as rownum 
from @table t2 
) v 
on (v.parentlevel = u.level and v.rownum = u.rownum) 
union          --and put 1 back 
select w.idx,w.level,w.level,w.idx 
from @table w 
where w.idx = 1 
order by v.idx 
+0

我确实要求TSQL,所以得到了我所要求的。它确实在SQL Server上工作正常,但刚刚发现TSQL窗口函数,例如通过分区不能在新问题中使用Jet/ACE SQL [这里是http://stackoverflow.com/questions/36674269/excel-vba-ado- sql-syntax-error-in-from-clause)您是否有兴趣为Jet/ACE SQL修改SQL? – curtisp

+0

刚拿走答案检查。仔细一看。这没有得到期望的结果。这些SQL结果直到索引24为止都是正确的。索引24父索引应该是23而不是13.该分组对于最小值而言看起来等级太高。 – curtisp

+0

指数24的样本数据是24,13,如果是24,24? –