返回另一列排序的最高值

时间:2018-09-26 20:10:04

标签: powerbi dax

假设我有一个如下表:

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的最佳方法是什么?

我已经尝试过了:

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

但是,这不适用于“总计”行,如果可能的话,我宁愿不必在度量中使用Year(在实际情况下,可能还有其他列需要担心)。 / p>


注意::我在下面的答案中提供了几种解决方案,但我也希望看到其他方法。

理想情况下,如果MAXX函数中有一个额外的参数,它可以指定找到最大值之后要返回哪一列,就像MAXIFS Excel函数一样,就很好了。

2 个答案:

答案 0 :(得分:1)

另一种实现方法是使用TOPN函数。

TOPN函数返回整行而不是单个值。例如,代码

TOPN(1, TableA, TableA[Value])

返回TableA排序的TableA[Value]的前1行。与该顶部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会将其解释为常规值。

答案 1 :(得分:0)

一种方法是存储最大值并将其用作过滤条件。

例如,

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