返回按另一列排序的最高值

Ale*_*son 4 dax powerbi

假设我有一个表如下:

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 }
    }
)
Run Code Online (Sandbox Code Playgroud)

我想要一个Group基于它ValueYear过滤器上下文内部或外部工作的返回顶部的度量。也就是说,它可以在这样的矩阵视觉中使用(包括 Total 行):

矩阵视觉

使用 DAX 不难找到最大值:

MaxValue = MAX(TableA[Value])
Run Code Online (Sandbox Code Playgroud)

或者

MaxValue = MAXX(TableA, TableA[Value])
Run Code Online (Sandbox Code Playgroud)

但是,查找Group与该值对应的 的最佳方法是什么?

我试过这个:

Top Group = LOOKUPVALUE(TableA[Group],
                TableA[Year], MAX(TableA[Year]),
                TableA[Value], MAX(TableA[Value]))
Run Code Online (Sandbox Code Playgroud)

但是,这对 Total 行不起作用,Year如果可能的话,我宁愿不必在度量中使用 the (在实际场景中可能还有其他列需要担心)。


注意:我在下面的答案中提供了几个解决方案,但我也很想看到任何其他方法。

理想情况下,如果函数中有一个额外的参数MAXX来指定在找到最大值后返回哪一列,这会很好,就像MAXIFS Excel 函数所具有的那样。

Ale*_*son 5

另一种方法是通过使用该TOPN函数。

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

TOPN(1, TableA, TableA[Value])
Run Code Online (Sandbox Code Playgroud)

返回TableAordered by的前1 行TableA[Value]Group与顶部关联的值Value在行中,但我们需要能够访问它。有几种可能性。


使用MAXX

Top Group = MAXX(TOPN(1, TableA, TableA[Value]), TableA[Group])
Run Code Online (Sandbox Code Playgroud)

这将在第一个参数GroupTOPN表中找到最大值。(只有一个Group值,但这允许我们将表转换为单个值。)


使用SELECTCOLUMNS

Top Group = SELECTCOLUMNS(TOPN(1, TableA, TableA[Value]), "Group", TableA[Group])
Run Code Online (Sandbox Code Playgroud)

此函数通常返回一个表(具有指定的列),但在这种情况下,它是一个单行单列的表,这意味着 DAX 将其解释为一个常规值。


unp*_*far 2

另一种方法是使用 DAX 系列的最新成员:窗口函数,在本例中我们将使用 INDEX() 函数。

   CALCULATE ( 
        MAX(TableA[Group] ), 
            INDEX ( 
                1,   
                ORDERBY (TableA[Value] , DESC), 
                 PARTITIONBY ( TableA[Year] )
            ) 
    )
Run Code Online (Sandbox Code Playgroud)