2016-04-15 152 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? –