Страницы: 1
RSS
PQ - Как отсортировать текст в строках в алфавитном порядке
 
Доброго всем вечера. Нижеприведенный код делает следующее:
1. Объединяет все наименования по совпадению из столбца "Promo". К примеру Promo1 соответствуют Apple, Banana, Pear. Остальные по аналогии.
2. Размножает объединенные наименования по количеству совпадений. Т.е. к примеру если Promo1 встречается 3 раза, то соответственно объединенные наименования также повторяются 3 раза.
Не могу понять, как отсортировать наименования соответствующие Promo2 в алфавитном порядке, чтобы было Apple. Orange а не наоборот. Точнее, на каком этапе впихнуть List.Sort. Нужный результат показан в столбце Desired Output.

Код
let
    from = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    group = Table.Group(from, {"Promo"}, {{"All Products", each Text.Combine([Product],", "), type text}}),
    occur = Table.AddColumn(group, "Occur", each List.Count(Table.SelectRows(from,(x)=>[Promo]=x[Promo])[Promo])),//Count occurences
    expand = Table.AddColumn(occur, "Custom", each List.Repeat({2},[Occur])),
    select = Table.ExpandListColumn(expand, "Custom"),
    end = Table.SelectColumns(select, {"All Products"})
in
    end


Update.
Вопрос снят. Это я реально тупанул и поторопился, надо было просто немного подумать.
Код
Text.Combine(List.Sort([Product]),", ")

Думаю, тему можно закрывать, хотя рад буду видеть альтернативное и/или более компактное решение.
Изменено: memo - 29.08.2022 02:10:36
 
memo, не всегда краткость = производительность. А тем более понятность кода. :)
Но шаг “occur” - тут самое слабое место. Скорее всего, для каждой строки PQ будет заново грузить таблицу from с листа. Да и просто фильтровать столько раз таблицу тоже не быстро.
Не с компа, поэтому наугад :)
Код
  group = Table.Group (
    from,
    { "Promo" },
    { { "All Products", ( t ) => List.Repeat ( { Text.Combine ( List.Sort ( t[Product] ), ", " ) }, Table.RowCount ( t ) ), type {text} } }
  )

Или так:
Код
  group = Table.Group (
    from,
    { "Promo" },
    {
      {
        "All Products",
        ( t ) =>
          [
            comb = Text.Combine ( List.Sort ( t[Product] ), ", " ),
            res  = List.Transform ( t[Product], ( x ) => comb )
          ][res],
        type {text}
      }
    }
  )
Изменено: surkenny - 29.08.2022 06:50:13
 
Вариант:
Код
let
  from = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  TblBuffe = Table.Buffer(
    Table.Sort(from, {{"Promo", Order.Ascending}, {"Product", Order.Ascending}})
  ), 
  Group = Table.Group(
    TblBuffe, 
    {"Promo"}, 
    {{"All Products", each Text.Combine([Product], ", "), type text}}
  ), 
  AddColumn = Table.AddColumn(
    Group, 
    "Пользовательский", 
    each List.Repeat({[All Products]}, List.Count(Text.Split([All Products], ",")))
  ), 
  SelectCol = Table.SelectColumns(AddColumn, {"Пользовательский"}), 
  Expand = Table.ExpandListColumn(SelectCol, "Пользовательский")
in
  Expand
 
В общем. В момент группировки у нас уже есть изначальная таблица, отфильтрованная по текущей группе.
Мы можем внутри функции группировки:
1. Посчитать строки таблицы и столько раз повторить список из одного элемента - нашего комбинированного значения.
2. Просто изменить значение всего столбца Product таблицы (или все элементы списка значений этого столбца) на комбинированное значение.
Не нужно делать это в отдельных шагах :)
Изменено: surkenny - 29.08.2022 07:03:51
 
surkenny, azma, Благодарю :)
Ну где еще можно быстро освоить столько нюансов, кроме как на форуме!
 
Гуру Power Query, подскажите: взяв (для повышения скила :) ) исходный код и файл azma, разложив его на более-менее простой для меня вариант в сцепке List.Repeat-List.Count-Text.Split и всё получилось (запрос "Простой вариант"). Ещё больше его "разложив" на отдельные шаги, уже в конце при шаге с List.Repeat список формируется "неправильно" (запрос "Простой пошаговый вариант). В чём ошибка?
 
вы не тот столбец взяли , вот так надо:

= Table.AddColumn(#"Добавлен пользовательский объект1", "Пользовательская.3", each List.Repeat({[Пользовательская]},[Пользовательская.2]))
Изменено: azma - 29.08.2022 15:28:26
 
azma, спасибо.  
Страницы: 1
Наверх