LOOKUPVALUE на основе агрегатной функции в DAX - PullRequest
0 голосов
/ 19 ноября 2018

Мне нужен вычисляемый столбец (потому что он будет использоваться в слайсере), который возвращает самый последний руководитель сотрудника.

Образец данных (таблица «Производительность»):

EMPLOYEE    |   DATE        |   SUPERVISOR
--------------------------------------------
Jim         |   2018-11-01  |   Bob
Jim         |   2018-11-02  |   Bob
Jim         |   2018-11-03  |   Bill
Mike        |   2018-11-01  |   Steve
Mike        |   2018-11-02  |   Gary

Желаемый вывод:

EMPLOYEE    |   DATE         |  SUPERVISOR  |   LAST SUPER
---------------------------------------------------------------
Jim         |   2018-11-01   |  Bob         |   Bill
Jim         |   2018-11-02   |  Bob         |   Bill
Jim         |   2018-11-03   |  Bill        |   Bill
Mike        |   2018-11-01   |  Steve       |   Gary
Mike        |   2018-11-02   |  Gary        |   Gary

Я пытался использовать

LAST SUPER =
LOOKUPVALUE (
    Performance[SUPERVISOR],
    Performance[DATE], MAXX ( Performance, [DATE] )
)

но я получаю ошибку:

Ошибка вычисления в столбце «Производительность» []: таблица с несколькими значения были предоставлены там, где ожидалось одно значение.

После дальнейших исследований кажется, что этот подход был обречен с самого начала. Согласно this значение поиска не может ссылаться ни на один столбец в той же самой таблице, в которой выполняется поиск. Однако даже когда я изменил значение поиска на TODAY() или статическую дату в качестве теста, я получил ту же ошибку с несколькими значениями. MAXX() также возвращает максимальную дату во всей таблице, а не только для этого сотрудника.

Мне было интересно, была ли это проблема многих ко многим, поэтому я вернулся к Power Query, продублировал исходный запрос, сгруппированный по EMPLOYEE, чтобы получить MAX (DATE), сопоставил оба поля с исходным запросом, чтобы получить SUPERVISOR в MAX. (ДАТА), и может рассматривать это как обычную таблицу поиска. Хотя это работает, неудивительно, что обновление заметно медленнее.

Я не могу решить, слишком ли я усложняю, упрощаю или просто схожу с ума при любом подходе, но я был бы благодарен за любые предложения.

Я хотел бы знать следующее:

  1. Можно ли использовать простую функцию, например LOOKUPVALUES (), для достижения желаемого результата?
  2. Если нет, есть ли более эффективный подход, чем дублирование запроса?

1 Ответ

0 голосов
/ 19 ноября 2018

Причина, по которой LOOKUPVALUE выдает эту конкретную ошибку, заключается в том, что выполняется поиск по всей таблице, а не только по строкам, связанным с этим конкретным сотрудником.Поэтому, если у вас есть несколько супервизоров, соответствующих одной и той же максимальной дате, у вас есть проблема.

Если вы хотите использовать для этого функцию LOOKUPVALUE, я предлагаю следующее:

Last Super = 
VAR EmployeeRows =
    FILTER( Performance, Performance[Employee] = EARLIER( Performance[Employee] ) )
VAR MaxDate = MAXX( EmployeeRows, Performance[Date] )
RETURN
LOOKUPVALUE(
    Performance[Supervisor],
    Performance[Date], MaxDate,
    Performance[Employee], Performance[Employee]
)

Здесь есть два ключевых различия.

  1. Я беру максимальную дату только по строкам для этого конкретного сотрудника (EmployeeRows).
  2. Я включаюEmployee в функции поиска, чтобы она соответствовала только соответствующему сотруднику.

Для других возможных решений см. Этот вопрос:

Возвратверхнее значение, упорядоченное по другому столбцу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...