В М: как связать (не объединить) две таблицы вместе? - PullRequest
1 голос
/ 07 марта 2020

Все встроенные функции M предполагают наличие «ключа» (и только одной клавиши key), с помощью которого вы хотите объединить две таблицы. Исключением является Table.Combine(), в котором объединяются столбцы с одинаковыми именами.

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

Как мне это сделать?

Ответы [ 2 ]

0 голосов
/ 10 марта 2020

Вы можете сделать это, превратив таблицы в столбцы и соединив их обратно в одну большую таблицу.

Используйте Table.FromColumns и Table.ToColumns вместе с некоторыми функциями имен столбцов и List.Combine.

Таблица функций Power Query Справочник

= Table.FromColumns(
      List.Combine(
          {
           Table.ToColumns(Table1),
           Table.ToColumns(Table2)
          }
      ), 
      List.Combine(
          {
           Table.ColumnNames(Table1),
           Table.ColumnNames(Table.TransformColumnNames(Table2, each _ & ".2"))
          }
      )
  )

Я добавил ".2" к именам столбцов в Table2, чтобы они были уникальными. Вы можете написать это, чтобы добавить, только если это имя совпадает с именем из Table1, но я не хотел больше загромождать вещи. Для этого используйте следующее преобразование:

each if List.Contains(Table.ColumnNames(Table1), _) then _ & ".2" else _

0 голосов
/ 07 марта 2020

Функция R cbind() обеспечивает функциональность, аналогичную описанной, поэтому в Power BI я назвал свой запрос "cbind". R не беспокоит несколько столбцов, имеющих одно и то же имя, но M есть, следовательно, использование префикса для устранения неоднозначности столбцов. Префикс должен быть предоставлен в качестве необязательного аргумента; мои префиксные имена переменных предполагают иметь дело с этими обнуляемыми аргументами. Table.FromColumns() не позволяет пользователю указать значение для заполнения пробелов, поэтому null это так.

(table1 as table, table2 as table) =>
let
    Prefix1NoNull = "a.",
    Prefix2NoNull = "b.",
    CommonColumns = List.Intersect({Table.ColumnNames(table1), Table.ColumnNames(table2)}),
    Table1Names = List.Transform(Table.ColumnNames(table1), each if List.Contains(CommonColumns, _) then Prefix1NoNull & _ else _),
    Table2Names = List.Transform(Table.ColumnNames(table2), each if List.Contains(CommonColumns, _) then Prefix2NoNull & _ else _),
    Result = Table.FromColumns(Table.ToColumns(table1) & Table.ToColumns(table2), Table1Names & Table2Names)
in
    Result
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...