Power Query Дочерняя иерархия - PullRequest
0 голосов
/ 28 мая 2018

У меня есть проблема, которую мне нужно решить в силовом запросе.

У меня есть таблица, содержащая столбцы Name, ID и Parent ID

Name ID Parent
A    1   
B    2   1
C    3   1
D    4   2
E    5   2

Мне нужно преобразовать эту таблицу так, чтобы яполучить одну строку для каждого ребенка (и оригинала), который есть в этой строке.В этом примере это даст 11 строк.

Name  ID
A     1
A     2
A     3
A     4
A     5
B     2
B     4
B     5
C     3
etc.

Я знаю, что это делается с помощью какого-то объединения, но похоже на цикл, и я не знаю, как делать циклы в Power Query.

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Попробуйте, не обязательно правильно, пожалуйста, проверьте его. У кого-нибудь еще есть лучшее решение?

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    Top = Table.SelectRows(Source, each ([Parent] = null)),
    Path = Table.AddColumn(Top, "Path", each #table({"Name","ID"},{{[Name],[ID]}})),
    Loop = Table.Combine(List.Generate(()=>
             Path,     
             each not Table.IsEmpty(_),
             each [ 
                  a = Table.NestedJoin(Source,{"Parent"},_,{"ID"},"join",JoinKind.Inner),
                  b = Table.ExpandTableColumn(a, "join", {"Path"}, {"Pre_Path"}),
                  c = Table.AddColumn(b,"Path", each [Pre_Path]&Table.Group([Pre_Path],"Name",{"ID",(x)=>[ID]})&#table({"Name","ID"},{{[Name],[ID]}}))
                  ][c]
     )),
    Result = Table.Distinct(Table.Combine(Loop[Path])),
    Sort = Table.Buffer(Table.Sort(Result,{{"Name",0}, {"ID",0}}))
in
    Sort

Power Pivot намного проще, вы можете использовать PATH для решения проблемы иерархии родитель-потомок,enter image description here

0 голосов
/ 29 мая 2018

Дружественное Reddit пользовательское решение для этого.

(ID as list, CurrentItem as number, FullTable as table) as list =>
    let
        CurrentID = ID{CurrentItem},
        ParentRows = Table.SelectRows(FullTable, each [Parent] = CurrentID),
        AddNodes = if Table.RowCount(ParentRows) > 0 then List.Distinct(ID & ParentRows[ID]) else ID,
        FinalResult = if (List.Count(ID) = List.Count(AddNodes)) and CurrentItem = List.Count(ID) - 1 then ID else BuildNodes(AddNodes, CurrentItem + 1, FullTable)
    in
        FinalResult
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...