假设我有一个如下表:
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
的度量。也就是说,它可以在这样的矩阵视觉中使用(包括“总计”行):
使用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函数一样,就很好了。
答案 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
。