Страницы: 1
RSS
Поиск всех родителей в иерархии
 
Добрый день,

Помогите пожалуйста с кодом. Он вроде как работает, но не как надо.
Я хочу найти всех родителей для данного Child_Id:
делаю это так:
Код
let
    Source = TERGET_LIST,

    expandHierarchy = (table, iter) =>
        let
            joinedTable = Table.NestedJoin(table, {"Target Child_ID  LIST"}, HIERARCHY, {"Child_ID"}, "HIER_L" & Text.From(iter), JoinKind.Inner),
            Personnalisé = Table.ExpandTableColumn(joinedTable, "HIER_L" & Text.From(iter), {"Parent_Id", "Parent_Name"}, {"Id_parent_" & Text.From(iter + 1), "Parent_" & Text.From(iter + 1)})
        in
            Personnalisé,

    iterations = List.Generate(() => 0, each _ < 7 and Table.RowCount(expandHierarchy(Source, _)) > 0, each _ + 1),
    expandedTable = List.Accumulate(iterations, Source, (state, current) => expandHierarchy(state, current)),
    resultTable = if List.Count(iterations) > 0 then expandedTable else null
in
    resultTable


Проблема в том, что даже если код родителя не находится в списке детей - код просто дублирует код родителя - а я хочу null.
В приложенном файле - прилагаю код с желаемым резульатом и с результатом текущего кода.

Спасибо за любую помощь.
 
Цитата
badzen написал:
Он вроде как работает, но не как надо.
ага, "работает". Да он просто считает всегда одно и то же. Разбираться в нем не стал.
не самый быстрый, но рабочий вариант
Пришелец-прораб.
 
badzen,  такой еще вариант
AlienSx, хотел попросить посмотреть - правильно ли буферизацию сделал?)
Код
let
    //словарь родители
    a1 = Table.TransformColumns(HIERARCHY, {}, Text.From), 
    a2 = Record.FromList(Table.ToList(a1, List.Skip), Table.ToColumns(a1){0}),
    //список дети
    b1 = Table.TransformColumns(TERGET_LIST, {}, Text.From),
    b2 = List.Transform(Table.ToColumns(b1){0}, (x)=>[id_child = x]&f(x)),
    
    f = (x)=>  [z1 = List.RemoveRange (Record.Field(a2, x), 1,1),
                f1 = (y)=>if Record.FieldOrDefault(a2, y{0}, null) = null then {null} else Record.Field(a2, y{0})&@f1(Record.Field(a2,y{0})),
                z2 = List.Buffer(List.Split(List.RemoveLastN(f1(z1)),3)),
                z3 = List.Buffer(List.Transform(z2, (y)=>List.RemoveRange (y, 1,1))),
                z4 = List.Transform({2..List.Count(z3)+1}, (y)=> {"id_parent_"&Text.From(y), "parent_"&Text.From(y)}),
                z5 = Record.FromList(z1&List.Combine(z3), {"id_parent_1", "parent_1"}&List.Combine(z4))][z5],
    
    to = Table.FromRecords(b2, Record.FieldNames(Record.Combine(b2)), MissingField.UseNull)
in
    to
Изменено: Garrys - 02.02.2024 13:41:14
 
Цитата
Garrys написал:
правильно ли буферизацию сделал
нашли у кого спросить :) Я не настолько прошаренный, чтобы в таких вопросах давать оценки. Но я бы избегал вот таких конструкций {2..List.Count(z3)+1} в качестве аргумента функции. С другой стороны, вот вы поставили List.Buffer. Казалось бы, что в этом плохого? Хуже ведь не будет. Не все так однозначно. Смотрите промер скоростей (в последнем варианте я убрал из вашего кода List.Buffer в z2 и z3.

Буфер заставляет машину просчитать весь список (или таблицу). А вдруг это время потрачено зря? Может внутренние механизмы PQ так все оптимизирует, что для определенных вычислений не нужна вся таблица/лист. К примеру, List.SelectFirstN. M не станет генерить весь список, чтобы потом взять оттуда первые 3, насколько мне известно (т.н. M streaming semantics). А может это только на малых объемах проявляется, а на больших все будет наоборот? Вообщем, для меня это пока малоизученная тема и я уклонюсь от ответа  :D
И, кстати, ваш код не решает поставленную задачу :) ТС просил зафиксировать кол-во (7 в этом случае) и таблицу формировать с учетом этого. У меня часть кода потрачена именно на это условие.
Изменено: AlienSx - 02.02.2024 14:54:00
Пришелец-прораб.
 
Цитата
AlienSx написал:
убрал из вашего кода List.Buffer
странно, у меня в промерах показывает практически одинаковую скорость с вашим кодом не убирая List.Buffer)

Цитата
ТС просил зафиксировать кол-во
ну явно этого не было написано, поэтому сделал динамический набор)
Изменено: Garrys - 02.02.2024 15:44:56
 
Цитата
Garrys написал:
странно
значит от конфигурации железо - софт зависит.
Цитата
Garrys написал:
ну явно этого не было написано,
ну да, согласен. Динамический - правильнее. Но в таблице с "хочухой" (и коде ТС) именно фикс кол-во за каким то  лешим.
Пришелец-прораб.
Страницы: 1
Наверх