2016-04-15 7 views
0

Ich habe Datensatz mit zwei Spalten: Index und Ebene.SQL-Abfrage - Eltern-Index aus Ebene und Kind-Index

Level ist die Nummer, die die Ebene in der Hierarchie der verschachtelten übergeordneten untergeordneten Datensätze angibt.

Die Datensätze sind in der Reihenfolge der Hierarchie und Index ist nur die Zeilennummer des Datensatzes.

Die Regel ist, dass jeder übergeordneten Datensatz Rekordwert = Kinder Ebene hat - 1.

Meine Herausforderung ist der Eltern-Index auf der Grundlage dieser Regel zu identifizieren.

Für jeden Datensatz muss ich SQL-Abfrage, die den übergeordneten Index des Datensatzes erhalten.

Die SQL-Abfrage wird ein Selbst verbinden, und den maximalen Indexwert erhalten, wo die Self-Join-Index < child.index und die Self-Join level = child.level

ich Hilfe brauche, um herauszufinden, wie man schreibt diese SQL.

Ich kann MS Access verwenden oder SQL in VBA verwenden, um diese Abfrage durchzuführen.

Dies ist eine visuelle Darstellung des Datensatzes.

enter image description here

Dies ist ein Beispieldaten und erwartete Ergebnis .. wollen Eltern Index .. geordneten Ebene ist Kind Level erreichen - 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 

Edited hinzufügen: Ich habe versucht, dies zu tun in Excel Power Query, und eine Antwort gefunden, aber es dauert ewig zu laufen, so müssen SQL VBA/ADO-Lösung zu finden. Aber hier ist Power Query-Lösung, um Ideen zu geben, wie man SQL macht.

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" 

Mit dieser Power-Abfrage Lösung findet Max Index, in dem jeden Zeilenindex < alle Indices und level = Niveau -1

+0

einige Proben zusammen mit erwartetem Ergebnis würde helfen – TheGameiswar

+0

Bitte liefern Sie Beispieldaten und erwartetes Ergebnis. –

+0

Bitte keine Daten als Bild angeben. Wir müssten es erneut eingeben ... Bitte fügen Sie Ihre Daten einen Copy'n'pasteable Text hinzu. Am besten wäre ein Testszenario mit einer CREATE TABLE- und einigen INSERT INTO-Anweisungen. Sie würden viel mehr gute Antworten bekommen ... – Shnugo

Antwort

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 

Ausgabe

----------------------------- 
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

Ich habe nach TSQL gefragt, also bekam ich, wonach ich gefragt habe. Es funktioniert gut mit SQL Server, aber gerade entdeckte TSQL-Fensterfunktionen, zB über Partition, sind mit Jet/ACE SQL in einer neuen Frage nicht verfügbar [hier] (http://stackoverflow.com/questions/36674269/excel-vba-ado- sql-syntax-error-in-from-Klausel) Sind Sie daran interessiert, SQL dort für Jet/ACE SQL zu ändern? – curtisp

+0

Nur nahm die Antwort zu überprüfen. Genau betrachtet. Dies hat nicht zum gewünschten Ergebnis geführt. Diese SQL-Ergebnisse waren bis zum Index 24 korrekt. Der übergeordnete Index des Index 24 sollte 23 und nicht 13 sein. Die Gruppierung sucht zu weit nach oben in der Hierarchie nach dem minimalen Wert. – curtisp

+0

Die Beispieldaten für Index 24 sind 24,13, sollte dies 24,24 sein? –

Verwandte Themen