Проблемы с RANKX () в DAX, PowerBI

#powerbi #dax

#powerbi #dax

Вопрос:

Я изучаю DAX и запутался в RANKX () в PowerBI. Вот мои данные:

введите описание изображения здесь

И вот моя мера:

 Rank = RANKX(
    ALL(RankDemo[Sub Category]),
    CALCULATE(SUM(RankDemo[My Value])))
  

Вот мой визуальный:

введите описание изображения здесь

RANKX () работает нормально, но поле [Мое значение] должно быть суммировано в настройках поля PowerBI: введите описание изображения здесьвведите описание изображения здесь

Если я выберу Не суммировать, ранг будет равен 1. Кто-нибудь может это объяснить? Какое отношение имеет сумма к RANKX () или CALCULATE () в DAX. Спасибо.

Ответ №1:

Проблема, с которой вы столкнулись, не имеет ничего общего с RANKX. Проблема заключается в так называемой «неявной мере» — (к сожалению) распространенной плохой практике в Power BI и Power Pivot.

Числовые поля в Power BI могут выполнять две роли:

  • они могут быть входными данными в показатели DAX (такие как SUM () и т.д.)
  • или они могут быть фильтрами (т. Е. выполнять ту же функцию, что и «Подкатегории» в вашем визуальном представлении).

Когда вы помещаете «Мое значение» в таблицу без каких-либо вычислений («Не суммировать»), вы сообщаете Power BI, что хотите, чтобы «Мое значение» служило фильтром. В сводных таблицах Excel это было бы эквивалентно удалению «Моего значения» в область «Строк» вместо «Значений». Таким образом, каждая строка в вашей таблице теперь сгруппирована по «Подкатегории Мое значение», а не просто «Подкатегория» (другими словами, вы сделали «Мое значение» частью контекста вашего фильтра). Поскольку каждая комбинация «Подкатегория Мое значение» уникальна, вы, по сути, ранжируете таблицы, состоящие из 1 записи (вот почему она всегда возвращает 1).

Когда вы выбираете «СУММА» для «Моего значения», это больше не фильтр строк — теперь это мера. Таким образом, теперь вы фильтруете контекст не по «Подкатегории» «Мое значение», а просто по «Подкатегории», и ваша формула RANKX работает должным образом. Вы можете легко убедиться в этом, удалив суммированное «Мое значение» из таблицы — показатель RANKX все равно будет работать таким же образом.

Когда вы используете это агрегирование «СУММЫ» для «Моего значения», вы указываете Power BI создать для вас меру DAX неявно (вот почему это называется «неявная мера»). Это происходит всякий раз, когда вы помещаете числовое поле непосредственно в визуальный файл. Такие неявные меры считаются плохой практикой среди опытных разработчиков по ряду причин, например:

  • это сбивает с толку (ваша проблема с RANKX — типичный пример);
  • вы не можете повторно использовать неявные меры (не можете ссылаться на них в других мерах DAX).

Решение заключается:

  • Никогда, никогда не добавляйте числовые поля непосредственно в визуальные элементы.
  • Вместо этого всегда записывайте показатель DAX, а затем переносите его в визуальный файл.

В вашем примере я бы создал явную меру DAX:

 Total Value = SUM(RankDemo[My Value])
  

Теперь вы можете использовать его везде в своей модели. Вы можете перенести это в визуальное изображение, чтобы увидеть сумму моего значения. Или вы можете использовать его в своей мере RANKX:

 Rank = RANKX( ALL(RankDemo[Sub Category]), [Total Value])
  

Преимущества такого дизайна заключаются в:

  • Никаких скрытых эффектов (вы точно знаете, что делает [Общее значение])
  • Вы можете использовать [Итоговое значение] во многих других формулах без необходимости снова и снова вводить суммирование.
  • Если вы измените DAX в [Total Value] (например, добавите округление), он автоматически обновит все другие формулы, в которых он используется.
  • Повторное использование показателей DAX делает формулы более чистыми и понятными.