UseRelationship или Role-Playing Dimension: работа с неактивными связями в Power BI
В модели Power BI связи важны для передачи фильтров, фильтр распространяется через связи. Однако иногда вы создаете взаимосвязь между двумя таблицами, которая осуществляется пунктирной линией. В этом посте мы объясним вам все, что вам нужно знать о пунктирных или “неактивных” связях, Мы объясним два разных метода взаимодействия с такими связями. Итак, готовы? Давайте приступим.
Почему важны связи в Power BI?
Для начала нам нужно понять, почему связи в Power BI так важны? Связь в реляционных системах баз данных важна для связывания таблиц друг с другом, но в Power BI связи также играют еще одну, более важную роль: фильтрация.
Чтобы понять, как работают связи, давайте проверим этот пример:
У нас есть пример файла Power BI, который получает данные из примера файла AdventureWorksDW Excel, и мы получаем информацию из двух таблиц: FactInternetSales и DimDate. Эти две таблицы НЕ связаны друг с другом в начале.
Теперь давайте создадим простую диаграмму столбцов с SalesAmount из таблицы FactInternetSales и FullDateAlternateKey из таблицы DimDate. Поскольку FullDateAlternateKey является полем даты, Power BI приносит иерархию по умолчанию, и я увижу данные поперечных и продольных срезов на самом высоком уровне иерархии, то есть “Годом”
Но подождите, это не срезы! Здесь показаны те же данные SalesAmount за каждый год с 2005 по 2010 год! Стоимость очень близка к 30 миллионам долларов, что на самом деле является общей суммой продаж в нашем наборе данных. Дело в том, что поле FullDateAlternateKey НЕ фильтрует таблицу FactSalesAmount.
Связь означает фильтрацию
Теперь давайте создадим связь между этими двумя таблицами на основе OrderDateKey в таблице FactInternetSales и DateKey в таблице DimDate;
Вот и все, давайте вернемся к этой же визуализации снова:
Как вы можете видеть тот же визуал, фильтрация на этот раз осуществляется по полю даты. Или, говоря иначе, теперь DimDate может ФИЛЬТРОВАТЬ таблицу FactInternetSales. Все это из-за связей. Без них мы не можем фильтровать данные по таблицам отдельно, вам может понадобиться сделать некоторые DAX-выражения.
Взаимодействие в Power BI означает фильтрацию и возможность делать срезы таблицы другой таблицей.
Теперь, когда вы сейчас связаны с фильтрацией, давайте посмотрим, что такое неактивная связь.
Неактивные связи
Тип связей, который вы видели выше, называется активным (Active). Существует другой тип связей, называемый неактивным (Inactive). Посмотрим, как будет создана неактивная связь. В предыдущем примере мы делали срезы данных по полю OrderDateKey, потому что это было поле, связанное с таблицей DimDate. Теперь предположим, что мы хотим делать срезы данных с помощью ShipDateKey. Очень простой подход заключается в создании другой связи между таблицей DimDate и FactInternetSales, но на этот раз с ShipDateKey. Вот результат:
Как видите, новый тип связей отличается. Это пунктирная линия, в отличие от активной, которая была сплошной линией. Это неактивная связь. У вас может быть только одна активная связь между двумя таблицами. Любые другие связи станут неактивными.
Неактивная связь не проходит фильтрацию. Она ничего не делает сама по себе. Зачастую можно увидеть, что многие люди создают неактивные связи в своей модели, думая, что только неактивные связи сами по себе сделают некоторую фильтрацию. Это не так. Если мы используем FullDateAlternateKey из таблицы DimDate, чтобы сделать срез SalesAmount из таблицы FactInternetSales, на основе какого поля мы делаем фильтрацию? Конечно, поле, которое имеет активную связь. Вот результат этого (который, по-видимому, такой же, как вы видели в предыдущем примере, потому что неактивная связь ничего не делает. Только активные связи проходят фильтрацию);
Неактивные связи не пропускают фильтрацию самостоятельно. Они нуждаются в обработке!
Да, неактивные связи требуют особого подхода к работе. Давайте посмотрим, как это может работать. Мы объясним две процедуры для неактивной связи: Ролевое измерение и метод UseRelationship.
Role-Playing Dimension
Измерение, которое играет роль множества измерений, называется ролевым измерением в терминологии хранилищ данных. В приведенном выше примере DimDate будет играть роль Order Date в некоторых сценариях, роль Date Ship в других сценариях, и иногда роль Due Date в некоторых других случаях. Мы уже объясняли пример использования вычисляемых таблиц в DAX для реализации ролевого измерения, поэтому давайте также рассмотрим его очень быстро.
Один из способов борьбы с неактивной связью - удалить причину ее создания! Если наличие нескольких взаимосвязей между двумя таблицами вызывает создание неактивных связей, один из способов избежать его, похоже, состоит в создании нескольких экземпляров одной и той же таблицы, а затем вам потребуется только одна связь, не более того.
Давайте создадим копию DimDate. Один из способов создания копии - использовать в ней вычисляемую таблицу с функцией ALL DAX;
ALL - это функция, которая дает вам всю таблицу. В этом случае мы создаем копию таблицы DimDate и называем ее ShipDate. Теперь вы можете создать нормальную активную связь между таблицей ShipDate и FactInternetSales (мы удалили неактивную связь из предыдущего раздела);
И теперь, в результате, у вас есть срезы по таблице ShipDate, а также Order Date (или, скажем, таблица DimDate);
Ролевое измерение - один из способов, которыми вы можете справиться с неактивными связями, но будьте осторожны с потреблением памяти!
Копируйте только небольшие таблицы
Метод ролевого измерения фактически копирует таблицу, и у вас будет вдвое больше потребления памяти. Дополнительное потребление памяти можно игнорировать, если таблица небольшая. Таблица даты - небольшая таблица. Для каждого года она составляет 365 строк, а в течение 20 лет она будет составлять около 7000 строк. Это очень мало по сравнению с таблицей фактов с миллионами строк. Это решение подходит для небольших таблиц. Но не используйте этот метод для больших таблиц. Если у вас есть таблица измерений с 5 миллионами строк и 30 столбцами, тогда метод ролевого измерения означает потребление того же объема пространства в 2-3 раза и более.
Избегайте ролевого измерения, если у вас таблица большого размера. Этот метод хорош только для небольших таблиц.
Функция UseRelationship в DAX
Другим методом обработки неактивных связей является использование функции в DAX, называемой UseRelationship. Эта функция DAX буквально говорит Power BI, что для этого выражения используйте эту связь, даже если она неактивна. Посмотрим, как работает эта функция.
Если мы продолжим тот же пример деления данных по дате Ship Date и предположим, что нет расчетной таблицы даты отправления, мы можем сделать это таким образом; Создайте снова неактивную связь между DimDate и FactInternetSales на основе ShipDateKey.
Теперь давайте создадим измерение Power BI со следующим выражением:
1 2 3 4 5 6 7 |
Sales by Ship Date = CALCULATE( SUM(FactInternetSales[SalesAmount]), USERELATIONSHIP( FactInternetSales[ShipDateKey], DimDate[DateKey] ) ) |
Это измерение рассчитывает сумму продаж по дате отправки. Весь секрет заключается в использовании функции UseRelationship. Этой функцией действительно просто пользоваться, вам просто нужно предоставить два столбца для ввода, которые являются двумя сторонами связи. Их порядок не важен.
UseRelationship (<column 1>, <column 2>)
Важным советом для рассмотрения является то, что вы должны иметь существующую неактивную связь для работы этой функции, иначе вы получите следующую ошибку:
Неактивные отношения должны существовать в противном случае UseRelationship не работает.
Одна таблица фильтрует другую таблицу на основе нескольких полей
Основное преимущество использования этого метода заключается в том, что теперь вы можете иметь таблицу DimDate для фильтрации таблицы фактов на основе как ShipDateKey, так и OrderDateKey одновременно, как показано ниже:
Как видно из приведенного выше скриншота, одна таблица дат фильтрует таблицу фактов на основе нескольких полей. Одна из них основана на OrderDateKey, который является активной связью, а другая - на ShipDateKey с использованием метода UseRelationship в этом измерении.
Этот метод не требует дополнительной памяти, однако вам необходимо создать измерение для каждого отдельного вычисления с помощью функции UseRelationship.
Подведем итоги
В этой статье вы узнали о неактивных отношениях и о том, как обрабатывать их с помощью двух методов: Ролевое измерение и функция UseRelationship в DAX. Метод ролевого измерения хорош для небольших таблиц, где дополнительное потребление памяти не является проблемой. Метод UseRelationship, с другой стороны, может быть хорошей альтернативой при больших таблицах. Существуют и другие преимущества, такие как получение одной фильтрации таблиц на основе нескольких полей одновременно с тем, что вы видели. Какой из этих или любых других методов вы используете?