假设我有一个表如下:
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基于它Value在Year过滤器上下文内部或外部工作的返回顶部的度量。也就是说,它可以在这样的矩阵视觉中使用(包括 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 函数所具有的那样。
另一种方法是通过使用该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)
这将在第一个参数Group的TOPN表中找到最大值。(只有一个Group值,但这允许我们将表转换为单个值。)
使用SELECTCOLUMNS:
Top Group = SELECTCOLUMNS(TOPN(1, TableA, TableA[Value]), "Group", TableA[Group])
Run Code Online (Sandbox Code Playgroud)
此函数通常返回一个表(具有指定的列),但在这种情况下,它是一个单行单列的表,这意味着 DAX 将其解释为一个常规值。
另一种方法是使用 DAX 系列的最新成员:窗口函数,在本例中我们将使用 INDEX() 函数。
CALCULATE (
MAX(TableA[Group] ),
INDEX (
1,
ORDERBY (TableA[Value] , DESC),
PARTITIONBY ( TableA[Year] )
)
)
Run Code Online (Sandbox Code Playgroud)