Как объединить две таблицы в PowerQuery с сопоставлением одного из множества столбцов? - PullRequest
0 голосов
/ 12 февраля 2019

Предположим, у нас есть два запроса PowerQuery:

  1. запрос с именем Query1 со столбцами Col1_1 и Col1_2
  2. запрос с именем Query2 со столбцами Col2_1 и Col2_2

Я знаю, что можно объединить эти два запроса с запросом на слияние, например так:

let
    Source = Table.NestedJoin(Query1,{"Col1_1", "Col1_2"},Query2,{"Col2_1", "Col2_2"},"Query2",JoinKind.LeftOuter)
in
    Source

В SQL это можно представить как

SELECT
    *
FROM
    Query1
    LEFT JOIN Query2 ON Query1.Col1_1 = Query2.Col2_1 AND Query1.Col1_2 = Query2.Col2_2

Вопрос : возможно ли объединить два запроса, если хотя бы один из двух столбцов совпадает?В SQL это можно представить как

SELECT
    *
FROM
    Query1
    LEFT JOIN Query2 ON Query1.Col1_1 = Query2.Col2_1 OR Query1.Col1_2 = Query2.Col2_2

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Вместо объединения таблиц другой возможностью будет добавление пользовательского столбца с использованием необходимой логики:

Table.AddColumn(Source, "JoinQuery2",
    (Q1) => Table.SelectRows(Query2,
                each Q1[Col1_1] = [Col2_1] or Q1[Col1_2] = [Col2_2]
            )
)

Затем вы можете развернуть этот столбец таблиц, как если бы вы сделали слияние.


Я получил эту идею из этого поста в блоге: Условия соединения в Power Query, часть 1

0 голосов
/ 12 февраля 2019

Насколько я знаю, нет никаких вариантов изменить метод сопоставления по умолчанию в функциях соединения в PQ.Однако вы можете сделать два объединения в каждом столбце, который хотите, а затем объединить результаты этих объединений.

Это приведет к дублированию совпадений при совпадении как col1, так и col2, но я не уверен, что это ожидаемый результат.Если нет, вы можете использовать PQ для настройки индексов, чтобы ловить эти дубликаты и удалять их.

Предполагается, что в Query2 также добавлен индекс, который выглядит следующим образом:

let
    Source = Query1,
    #"Added Index" = Table.AddIndexColumn(Source, "Index", 0, 1),
    #"Merged Queries" = Table.NestedJoin(#"Added Index",{"col1"},Query2,{"col1"},"col1Join",JoinKind.LeftOuter),
    #"Merged Queries1" = Table.NestedJoin(#"Merged Queries",{"col2"},Query2,{"col2"},"col2Join",JoinKind.LeftOuter),
    #"Added Custom" = Table.AddColumn(#"Merged Queries1", "MergeTables", each Table.Combine({[col1Join],[col2Join]})),
    #"Expanded Custom" = Table.ExpandTableColumn(#"Added Custom", "MergeTables", {"col1", "col2", "Index"}, {"Query2.col1", "Query2.col2", "Query2.Index"}),
    #"Removed Duplicates" = Table.Distinct(#"Expanded Custom", {"Index", "Query2.Index"}),
    #"Removed Columns" = Table.RemoveColumns(#"Removed Duplicates",{"Index", "col1Join", "col2Join", "Query2.Index"})
in
    #"Removed Columns"

Не очень масштабнорешение, но я думаю, что оно работает правильно?

...