DAX 尝试返回第 N 个排名的文本值时"multiple columns"错误



我正在研究一个解决方案来计算类似于 DAX for Power BI 中的 Qlikview FirstSortedValue 的东西。

据我所知,没有开箱即用的解决方案来获取文本值(很像类别(的功能,该值按其排名位于第 n 位。

我的问题是: 为什么这适用于单列,但在表上使用时返回多列错误?

CALCULATE (
SAMPLE (
1,
FILTER (
'table_name',
RANKX (
ALL ( 'table_name'[column_name] ),
CALCULATE ( COUNT ( 'table_name'[column_name] ) ),
, , SKIP
)
= Nth
),
TRUE ()
)
)

还有一个不同的变体:

CALCULATE (
SAMPLE ( 1, VALUES ( 'table_name'[column_name] ), TRUE () ),
FILTER (
'table_name',
RANKX (
ALL ( 'table_name'[column_name] ),
CALCULATE ( COUNT ( 'table_name'[column_name] ) ),
, , DENSE
)
= Nth
)
)

当它是单列时,这两种尝试以及我的更多尝试都有效,但是为什么在具有多列的表上使用时不起作用呢?它应该根据我选择的第 N 个等级返回 1 个文本值的样本? 类似于回答"根据销售额排名第 N 个最畅销的产品名称是什么?

我愣住了,仍在努力寻找答案。Firstnonblank不是一种选择,因为我不在乎仅获得排名第一的答案的解决方案;不要建议这样做。

从您现有的内容中使其工作的最简单方法是使用SELECTCOLUMNS将表变成单个列。

下面将为您提供一个列名为"列名"的单列表。

SELECTCOLUMNS( FILTER( [...] ), "Column Name", 'table_name'[column_name] )

CALCULATE (
SAMPLE (
1,
SELECTCOLUMNS(
FILTER (
'table_name',
RANKX (
ALL ( 'table_name'[column_name] ),
CALCULATE ( COUNT ( 'table_name'[column_name] ) ),
, , SKIP
)
= Nth
),
"Column Name",
'table_name'[column_name]
),
TRUE ()
)
)

不过,可能有更好的方法来整体解决问题,因此如果可能的话,请提供样本数据和所需输出的最小完整可验证示例。

我想出了一个适用于多列表的解决方案,但有一个警告 - 由于公式中使用的 SAMPLE(1...( 按字母顺序排列:

SAMPLE(1, FILTER(ALL('X'[Name]), RANKX(ALL(X[Name]), CALCULATE(COUNT('X'[Name])),,,skip) = Nth), TRUE())

稍后我将尝试添加一个解决方案,以一次性显示与CONCATENATEX(我已经开始工作(的关系,因此不会留下任何石头。

编辑:Oct 23 2018 在这里!最终的简洁版本:效果很好!

度量 =

VAR Nth = [number] RETURN CONCATENATEX(DISTINCT('table_name'[column_name]), CALCULATE(FILTER(VALUES('table_name'[column_name]), RANKX(ALL('table_name'[column_name]), CALCULATE(COUNT('table_name'[column_name])),,,Dense) = Nth)),",")

最新更新