2016-04-15 15 views
0

インデックスとレベルの2つのカラムを持つデータセットがあります。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のパワークエリでは、答えを見つけましたが、実行するために永遠にかかるので、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-from-from句)Jet/ACE SQL用にSQLを修正することに興味がありますか? – curtisp

+0

ちょうど答えのチェックを取った。近くに見た。これは望ましい結果を得られなかった。これらのSQL結果は、索引24まで修正されています。索引24の親索引は13ではなく、23であったはずです。 – curtisp

+0

インデックス24のサンプルデータは24,13ですが、これは24,24ですか? –

関連する問題