Вернуть верхнее значение, упорядоченное по другому столбцу - PullRequest
0 голосов
/ 26 сентября 2018

Предположим, у меня есть следующая таблица:

TableA =
DATATABLE (
    "Year", INTEGER,
    "Group", STRING,
    "Value", DOUBLE,
    {
        { 2015, "A", 2 },
        { 2015, "B", 8 },
        { 2016, "A", 9 },
        { 2016, "B", 3 },
        { 2016, "C", 7 },
        { 2017, "B", 5 },
        { 2018, "B", 6 },
        { 2018, "D", 7 }
    }
)

Мне нужна мера, которая возвращает верхнюю Group на основе ее Value, которая работает внутри или вне контекста фильтра Year.То есть его можно использовать в матричном визуале, например, (включая строку «Итого»):

Matrix Visual

Нетрудно найти максимальное значение с помощьюDAX:

MaxValue = MAX(TableA[Value])

или

MaxValue = MAXX(TableA, TableA[Value])

Но как лучше всего найти Group, который соответствует этому значению?

Я пробовалthis:

Top Group = LOOKUPVALUE(TableA[Group],
                TableA[Year], MAX(TableA[Year]),
                TableA[Value], MAX(TableA[Value]))

Однако для строки Total это не работает, и я бы предпочел не использовать Year в показателе, если это возможно (вероятно, есть другие столбцы, о которых нужно беспокоиться вреальный сценарий).


Примечание: Я даю пару решений в ответах ниже, но я бы хотел увидеть и другие подходы.

В идеале было бы неплохо, если бы в функции MAXX был дополнительный аргумент, который бы указывал, какой столбец возвращать после нахождения максимума, во многом как в функции Excel MAXIFS .

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Еще один способ сделать это - использовать функцию TOPN.

Функция TOPN возвращает всю строку (строки) вместо одного значения.Например, код

TOPN(1, TableA, TableA[Value])

возвращает верхнюю 1 строку TableA, упорядоченную по TableA[Value].Значение Group, связанное с этим верхним Value, находится в строке, но нам нужно иметь к нему доступ.Есть несколько возможностей.


Использование MAXX:

Top Group = MAXX(TOPN(1, TableA, TableA[Value]), TableA[Group])

Это находит максимум Group из таблицы TOPN в первом аргументе.(Существует только одно значение Group, но это позволяет нам преобразовать таблицу в одно значение.)


Использовать SELECTCOLUMNS:

Top Group = SELECTCOLUMNS(TOPN(1, TableA, TableA[Value]), "Group", TableA[Group])

Обычно эта функциявозвращает таблицу (с указанными столбцами), но в данном случае это таблица с одной строкой и одним столбцом, что означает, что DAX интерпретирует ее как обычное значение.

0 голосов
/ 26 сентября 2018

Один из способов сделать это - сохранить максимальное значение и использовать его в качестве условия фильтра.

Например,

Top Group =
VAR MaxValue = MAX(TableA[Value])
RETURN MAXX(FILTER(TableA, TableA[Value] = MaxValue), TableA[Group])

или аналогично,

Top Group =
VAR MaxValue = MAX(TableA[Value])
RETURN CALCULATE(MAX(TableA[Group]), TableA[Value] = MaxValue)

Если есть несколько групп с одинаковым максимальным значением, вышеприведенные меры выберут первую в алфавитном порядке.Если их несколько, и вы хотите показать их все, вы можете использовать объединенную итераторную функцию:

Top Group =
VAR MaxValue = MAX(TableA[Value])
RETURN CONCATENATEX(
           CALCULATETABLE(
               VALUES(TableA[Group]),
               TableA[Value] = MaxValue
           ),
           TableA[Group],
           ", "
       )

Если вы изменили 9 в TableA на 8, этот последний показательвернул бы A, B вместо A.

...