代码之家  ›  专栏  ›  技术社区  ›  Vaidøtas I.

尝试返回第n个排名文本值时DAX“多列”错误

dax
  •  0
  • Vaidøtas I.  · 技术社区  · 6 年前

    我正在研究一个解决方案来计算类似于QlikView在DAX中为Power BI提供的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个文本值的样本? 类似于回答“根据SalesCount,第n个畅销产品的名称是什么?”.

    我被难住了,仍在努力寻找答案。firstnonblank不是一个选项,因为我不关心只得到第一名答案的解决方案;不建议这样做。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Alexis Olson    6 年前

    最简单的方法是使用 SELECTCOLUMNS .

    下面将为您提供一个列名称为“column name”的单列表。

    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 样本数据和所需输出(如果可能)。

        2
  •  0
  •   Vaidøtas I.    6 年前

    我提出了一个解决方案,该方案适用于多列表,但有一个警告,因为公式中使用的样本(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)),",")