尝试返回第N个排名的文本值时出现DAX“多列”错误

时间:2018-10-22 07:28:56

标签: dax

我正在研究一种解决方案,用于在Power BI的DAX中计算与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,因为我不希望找到仅获得第一名的答案的解决方案。不建议这样做。

2 个答案:

答案 0 :(得分:1)

最简单的方法是使用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 ()
    )
)

尽管有可能更好地解决整个问题,所以请提供minimal complete verifiable example样本数据和所需的输出。

答案 1 :(得分:0)

由于在公式中使用了SAMPLE(1 ...),因此我想出了一种解决方案,该解决方案适用于具有警告关系的多列表:

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

我稍后将尝试添加解决方案,以解决与CONCATENATEX(我已经开始工作)的关系,以便一次展示,因此不会遗漏任何东西。

编辑:2018年10月23日 这里是!最终的简洁版本:很棒!

测量=

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)),",")