Страницы: 1
RSS
Трансформация таблицы PQ
 
Здравствуйте. Есть структура категорий интернет-магазина с иерархией parent/child1/child2/child3... Мне ее нужно переделать в 2 столбца, чтобы было только child/parent и в новой стуктуре удалить дубли.
Изменено: Oleksiy Babenko - 03.06.2020 16:59:21
 
Здравствуйте
добавьте еще 2 шага
Код
Filter = Table.SelectRows(Expanded, each ([parent] <> 0)),
Distinct = Table.Distinct(Filter, {"child", "parent"})
 
К сожалению простое удаление дубликатов тут не подойдет, т.к.может быть вариант parent1/child1/child3/child4 и parent2/child1/child3/child4 или parent2/child2/child3/child4. Удалив дубликаты мы получим только одну пару child3/child4, а нужно 3 разных.
 
Доброе время суток.
Может так?
Скрытый текст
 
Загрузил как пример


Профессиональная посуда для ресторанов, кафе,   баров // Столовые приборы // FoREST // Ложки
Любительское   оборудование // Столовые приборы // FoREST // Ложки
Любительское   оборудование // Столовые приборы // FoREST // Вилки
и связку Столовые приборы // FoREST получил 3 раза вместо 2х
Изменено: Oleksiy Babenko - 03.06.2020 21:22:42
 
Цитата
Oleksiy Babenko написал:
3 раза вместо 2х
Естественно, вы же в примере показали вывод исходных cats. Тогда что должно остаться
для пары предок потомок Столовые приборы  FoREST, если в столбце cats три разных значения? Вы уж определите, не стесняйтесь :)  А то ни слова, а претензии разработчику ;)
Изменено: Андрей VG - 03.06.2020 21:36:37
 
Андрей VG, извините, наверное неправильно сформулировал задачу. Нужна связка child/parent без повторов от ствола к ветвям.

Если взять как пример 3 строки из поста выше, то должно получиться как-то так.

https://prnt.sc/st7z72
Изменено: Oleksiy Babenko - 03.06.2020 22:16:08
 
Код Power Query:
let
   Source      = Excel.CurrentWorkbook(){[Name = "Таблица1"]}[Content],
   Split       = List.Buffer(
       List.Zip(
           List.Transform(
               Source[cats],
               each
                   let
                       a = List.Buffer({0} & Text.Split(_, " // ")),
                       b = List.Count(a)
                   in
                       List.Generate(
                           () => 0,
                           each _ < b,
                           each _ + 1,
                           each a{_} meta [parent = List.Range(a, 1, _)]
                       )
           )
       )
   ),
   ParentChild = List.Transform({0..List.Count(Split) - 2}, each
       let
           tbl = Table.FromColumns(List.Range(Split, _, 2), {"parent", "child"}),
           lst = Table.ToRecords(Table.SelectRows(tbl, each [child] <> null)),
           ret = Table.FromRecords(List.Distinct(lst, each {Value.Metadata([child]), [child]}))
       in
           ret),
   Result      = Table.AddColumn(
       Table.Combine(ParentChild),
       "path",
       each Text.Combine(Value.Metadata([child])[parent], " // ")
   )
in
   Result  
Изменено: Андрей Лящук - 03.06.2020 22:52:41
 
Андрей Лящук, спасибо огромное, практически идеально. А можно еще категории 1го уровня к общему стволу "0" подвязать?
Изменено: Oleksiy Babenko - 03.06.2020 22:28:50
 
Еще вариант
Код
// Таблица1
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    Add = Table.AddColumn(Source,"Child_Parent", each let a=List.Reverse( Text.Split([cats]," // ")),b=Table.FromColumns({a, List.Skip(a) & {0}},{"child","parent"}) in Table.AddIndexColumn(b,"id")),
    Expanded = Table.ExpandTableColumn(Add, "Child_Parent", {"child", "parent","id"}),
    Extracted = Table.AddColumn(Expanded, "cats2", each let a=[id] in Text.BeforeDelimiter([cats], "//", {a-1, RelativePosition.FromEnd}))[[cats2],[child],[parent]]
in
    Extracted
 
Михаил Л, спасибо.
 
обновил cвой пост
Изменено: Андрей Лящук - 08.06.2020 18:57:17
 
Андрей Лящук, спасибо за помощь. Периодически эта задача возникала, на решение ручками уходило немало времени.
Изменено: Oleksiy Babenko - 03.06.2020 22:59:49
Страницы: 1
Наверх