Выбор правильного типа слияния/объединения в Power BI
Ранее мы объясняли два способа объединения наборов данных друг с другом: Append и Merge. В этой статье мы хотим подробно объяснить, в чем разница между всеми типами типа слияния и объяснением того, как выбрать правильный тип слияния (Merge) или объединения (Join). Эти типы слияния очень похожи на типы соединений в реляционных базах данных. Поскольку многие люди, которые работают с Power BI, могут не иметь опыта работы с реляционными базами данных, то этот пост, вероятно, является хорошим объяснением в деталях, каковы эти типы и когда их использовать.
Набор данных для примера
Загрузите набор данных отсюда:
Что такое слияние?
Объединение двух наборов данных друг с другом может осуществляться несколькими способами. Одним из способов объединения наборов данных является слияние наборов данных. Слияние аналогично объединению реляционных баз данных. Объединение двух наборов данных друг с другом требует некоторых полей объединения, и в результате будет объединен набор столбцов из обоих наборов данных.
Давайте рассмотрим это с примером;
Рассмотрим две таблицы данных:
* Таблицы данных получены с этой веб-страницы. Загрузите его по ссылке вверху этой публикации.
Таблица клиентов:
Таблица заказов:
Слияние этих двух таблиц друг с другом дает вам набор данных с объединенным набором столбцов, как показано ниже;
Для слияния наборов данных друг с другом вам нужно иметь некоторые соединяющие пол. В этом примере соединяющее поле - customer_id. Чтобы получить набор данных, который включает все столбцы из обеих таблиц на основе отношений customer_id, вы можете присоединить таблицы друг к другу:
Как сделать слияние запросов
Выберите первый запрос (для этого примера: Orders), а затем из домашней вкладки Merge Queries появится два варианта:
- Merge Queries: это изменит существующий запрос (заказы), чтобы быть результатом слияния.
- Merge Queries as New: это не изменит существующий запрос. Он создаст ссылку из него, и результатом слияния будет другой запрос.
Выберите «Merge Queries as New».
В окне конфигурации Merge выберите вторую таблицу Customers, затем выберите поле объединения в каждой таблице (Customer_id). Вы также увидите количество совпадающих строк в качестве дополнительной информации.
Результатом этой операции будет новый запрос с именем Merge1, который имеет объединенный результат этих двух запросов.
Таблица в столбце Customers - это вспомогательная таблица из таблицы клиентов для записей, соответствующих этому customer_id. Затем вы можете расширить его до нужных столбцов;
и конечным результатом будут теперь все столбцы в одном запросе;
Этот процесс называется Merge Join. Однако есть некоторые конфигурации, которые вы можете здесь настроить;
Слияние на основе нескольких столбцов
Вы можете легко использовать несколько столбцов для слияния двух наборов данных. Просто выберите их в нужном порядке, удерживая клавишу Ctrl клавиатуры.
Этот метод может быть действительно полезен, поскольку вкладка отношений в Power BI Desktop не позволяет создавать отношения на основе нескольких столбцов. Однако в Power Query вы можете создать слияние и создать уникальное поле для отношений в Power BI Desktop. Вот статья об этом.
Типы слияния
В дополнение к столбцу слияния (или соединяющему полю); тип Merge очень важен. вы можете получить совершенно другой набор результатов с выбором другого типа слияния. Здесь вы можете увидеть Join Kind (или Merge Type);
В данный момент существует 6 типов объединений. Пару лет назад было доступно меньшее количество соединений. Однако вы всегда можете выбрать тип Join в сценарии Power Query M.
Каждое из этих объединений получает другой результирующий набор, давайте посмотрим, какова их разница.
LEFT и RIGHT.
Чтобы начать, вам нужно знать концепцию таблиц LEFT и RIGHT (или запросов). Когда вы объединяете два набора данных друг с другом, первый запрос считается LEFT, а второй - RIGHT.
В приведенном выше примере; Заказы - это запрос LEFT, а клиенты - это запрос RIGHT. При желании их можно изменить. Понимание этого важно, потому что большая часть форм Join работает с концепцией LEFT или RIGHT или же обоих.
Left Outer (Все строки из первой, совпадение со второй)
Первый тип Join / Merge - Left Outer. Это означает, что запрос LEFT является важным. Все записи из этого запроса (LEFT или FIRST) будут показаны в наборе результатов плюс их соответствующие строки в правой (или второй таблице). Этот тип соединения является типом по умолчанию. Если вы не укажете Join Kind, он будет всегда Left Outer.
Например, в первом примере слияния, который мы сделали, вы можете видеть, что набор результатов - 4 записи, представляющие 4 записи из левой таблицы (заказов) и соответствующие им строки в таблице клиентов.
Как вы можете видеть на скриншоте выше; есть два клиента, которых не будет в результирующем наборе. Клиенты с идентификаторами 4 и 5, потому что эти строки не соответствуют полю customer_id в таблице заказов. В LEFT Outer merge будут выбраны только записи из левой таблицы с соответствующими строками правой таблицы.
Right Outer (все строки из второй, совпадение с первой)
Иногда вам нужно получить все строки из второй таблицы, независимо от того, существуют ли они в первой таблице или нет. В этом случае вам нужно будет использовать другой тип Join, называемый Right Outer. С помощью этого типа Join вы получаете все строки из таблицы RIGHT (или second) с соответствующими строками слева (или первой таблицы). Вот пример:
Как вы можете видеть на скриншоте выше; все строки из таблицы клиентов отображаются в результирующем наборе, однако только 4 строки соответствуют таблице заказов. Если в таблице заказов нет записи, которая не соответствует ей, она будет выглядеть как Null (две красные строки в результирующем наборе).
Full Outer (все строки из обеих)
Этот тип соединения / слияния, как правило, самый безопасный среди всех. Он вернет все строки из обеих таблиц (соответствие и несоответствие). Вы будете иметь все строки из первой таблицы, а также все строки из второй таблицы и все соответствующие строки. С помощью этого метода вы не потеряете никаких записей.
Этот результат, как вы можете видеть, - 7 строк. 4 соответствия строк в обеих таблицах. 2 строки только в таблице клиентов, но не в таблице заказов. 1 строка только в таблице заказов, но не в таблице клиентов.
Inner (только соответствующие строки)
Этот метод выбирает только соответствующие строки. У вас не будет записи с нулевыми значениями (потому что эти записи генерируются в результате несоответствия). Вот пример:
Есть только 4 строки, которые сопоставляются между двумя таблицами. Строки с customer_id 1, 2 и 3. все не соответствующие строки будут исключены из набора результатов.
Left Anti (строки только в первой)
Если вас интересуют только строки из таблицы LEFT (первая), тогда это опция для выбора. Это означает, что строки находятся в первой таблице и НЕ совпадают со второй таблицей. Таким образом, только не соответствующие строки из первой таблицы. С параметрами Anti всегда вы получаете значение null для второго набора данных, поскольку эти строки там не существуют. Параметры защиты подходят для поиска строк, которые существуют в одной таблице, но не в другой. Вот пример:
Это найдет единственную строку, которая существует в таблице Orders и не соответствует ни одной из строк в таблице клиентов.
Right Anti (строки только во второй)
Аналогично Left Anti; этот метод даст вам только не соответствующие строки. Однако на этот раз со второй (правой) таблицы. Вы можете узнать, какие строки в правой таблице не совпадают с левой таблицей. Вот пример;
Этот набор результатов - это все строки из таблицы клиентов (правая таблица), которые НЕ соответствуют заказам (первая таблица).
Резюме
Различные типы объединения в слиянии возвращают разные результирующие множества. Убедитесь, что вы выбрали правильный тип соединения, чтобы избежать каких-либо проблем позже. Существует шесть типов объединений, как показано ниже;
- Left Outer: Строки из левой таблицы и соответствующие справа
- Right Outer: строки из правой таблицы и соответствующие слева
- Full Outer: строки из обеих таблиц (совпадающие или не совпадающие)
- Внутренний: только соответствие строк из обеих таблиц
- Left Anti: Не соответствующие строки из левой таблицы
- Right Anti: Не соответствующие строки из правой таблицы