Как я могу написать рекурсивный запрос в Power Query для обхода дерева - PullRequest
0 голосов
/ 07 октября 2019

Вопрос новичка: у меня есть таблица с идентификатором, ParentID и типом. Я хочу создать два новых столбца (StrategyID, SubstrategyID), который содержит идентификатор для строки, если ее тип = «Стратегия» или «Подстратегия». В противном случае я хочу посмотреть на родительскую строку и вернуть этот идентификатор, если он соответствует искомым типам. Если нет, повторите и посмотрите на родительский объект родителя и т. Д. Я не получаю синтаксис для функций в целом и рекурсивных функций в частности в PowerQuery.

Я просмотрел много примеров и видео, инашел некоторую помощь, но не специально для того, что я пытаюсь сделать.

------------------------------------------------------------
| Existing columns              New Colums                 |
------------------------------------------------------------
| ID | ParentID | Type        | StrategyID | SubstrategyID |
| 1  | 0        | Strategy    | 1          |               |
| 2  | 1        | Substrategy | 1          | 2             |
| 3  | 2        | Feature     | 1          | 2             |
| 4  | 3        | Story       | 1          | 2             |
| 5  | 3        | Story       | 1          | 2             |
| 6  | 1        | Substrategy | 1          | 6             |
| 7  | 6        | Feature     | 1          | 6             |
| 8  | 7        | Story       | 1          | 6             |
| 9  | 7        | Story       | 1          | 6             |
| 10 | 0        | Strategy    | 10         |               |
| 11 | 10       | Substrategy | 10         | 11            |
| 12 | 11       | Feature     | 10         | 11            |
| 13 | 12       | Story       | 10         | 11            |
| 14 | 12       | Story       | 10         | 11            |
| 15 | 12       | Story       | 10         | 11            |
| 16 | 10       | Substrategy | 10         | 16            |
| 17 | 16       | Feature     | 10         | 16            |
| 18 | 17       | Story       | 10         | 16            |
| 19 | 17       | Story       | 10         | 16            |
------------------------------------------------------------
'''

1 Ответ

0 голосов
/ 08 октября 2019

Дайте это попробовать. Предполагает исходные данные в таблице 1 с 3 столбцами - «ID», «ParentID» и «Type»

let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
ChangedType = Table.TransformColumnTypes(Source,{{"ID", type text}, {"ParentID", type text}}),
ID_List = List.Buffer( ChangedType[ID] ),
ParentID_List = List.Buffer( ChangedType[ParentID] ),
Type_List = List.Buffer( ChangedType[Type] ),

Highest =  (n as text, searchfor as text) as text =>
   let
        Spot = List.PositionOf( ID_List, n ),
        ThisType = Type_List{Spot},
        Parent_ID = ParentID_List{Spot}
     in if Parent_ID = null or ThisType=searchfor then ID_List{Spot} else @Highest(Parent_ID,searchfor),

FinalTable = Table.AddColumn( ChangedType, "StrategyID", each  Highest( [ID],"Strategy" ), type text),
FinalTable2 = Table.AddColumn( FinalTable, "SubstrategyID", each  Highest( [ID],"Substrategy" ), type text),
#"Replaced Errors" = Table.ReplaceErrorValues(FinalTable2, {{"SubstrategyID", null}})
in  #"Replaced Errors"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...