Страницы: 1
RSS
Power Query задача по Parent-Child
 
Добрый день, мы тут с чатжпт не можем решить задачу.
У меня уже есть код, который из таблицы с Кодом Ребенка, Кодом Родителя, Именем Ребенка, Именем Родителя - возвращает колонку HighestParent
Я пытаюсь просто добавить колонку HighestParent-1
То есть если у меня код ребенка А а у его предков соответственно B-C-D-E, я хочу получить Е для HighestParent и D для HighestParent-1
А для D из предыдущего примера  Е для HighestParent и тоже E для HighestParent-1.

Файл с power query в приложении мой код:
Код
let
    Source = Hierarchy,
    ListEnfant = List.Buffer( Source[#"Id Compte enfant"] ),
    ListParentID = List.Buffer( Source[#"Id Compte parent"] ),

    fnAncetre =  (n as text) as text =>
        let
            PosOfParent = List.PositionOf( ListEnfant, n ),
            ParID = if PosOfParent >= 0 then ListParentID{PosOfParent} else null
         in
            if ParID = null then n else @fnAncetre(ParID),

    AncetreID = Table.AddColumn( Source, 
                                  "HighestParent", 
                                  each  fnAncetre( [#"Id Compte enfant"] ), 
                                  type text)
in
    AncetreID

Спасибо за любой совет.
Изменено: badzen - 10.03.2023 16:21:21
 
Возможно подойдет рекурсивный вызов функции-запроса.
https: www. youtube. com/watch?v= 02zPDFN1HBY - первые несколько строк поиска выдали.
Неизлечимых болезней нет, есть неизлечимые люди.
 
TheBestOfTheBest, так он вроде и делает это (@fnAncetre(ParID))
badzen, код, очевидно, взят отсюда. Если я правильно вас понял, то вам не хватает данных из предпоследнего шага? Всю цепочку вы можете получить с помощью List.Generate, например (ну как мне кажется  :) ). И уже оттуда вытягивать последнее, предпоследнее и какое хотите значение. Можно подумать насчет оптимизации алгоритма, конечно (цепочки то отрабатываются по многу раз). Но я бы для начала решил эту вашу насущную задачу "тупо в лоб", а потом "допиливал" решение до оптимального.  
Пришелец-прораб.
 
Alien Sphinx, ну по сути можно особо не париться и всего лишь чуть изменить функцию:
Код
let
  Source = Hierarchy,
  ListEnfant = List.Buffer ( Source[#"Id Compte enfant"] ),
  ListParentID = List.Buffer ( Source[#"Id Compte parent"] ),
  fnAncetre = ( n as text, optional k as text ) as record =>
    let
      PosOfParent = List.PositionOf ( ListEnfant, n ),
      ParID       = if PosOfParent >= 0 then ListParentID{PosOfParent} else null
    in
      if ParID = null then [ HighestParent = n, preHighestParent = k ] else @fnAncetre ( ParID, n ),
  AncetreID = Table.FromRecords ( Table.TransformRows ( Source, ( r ) => Record.Combine ( { r, fnAncetre ( r[#"Id Compte enfant"] ) } ) ) )
in
  AncetreID
Изменено: surkenny - 11.03.2023 00:16:42
Страницы: 1
Наверх