首页 文章

Power BI DAX为过滤行计算最新值

提问于
浏览
2

我在Power BI DirectQuery表中有数据,看起来像这样:

Name    Tx     TxDate   Other Columns
-------------------------------------------------------
A       1      1/1/2017
A       2      1/3/2017
A       3      1/4/2017
B       4      1/5/2017
B       5      1/6/2017
C       6      1/1/2017
C       7      1/2/2017
C       8      1/9/2017

在visual visual中,我想只显示每个名称的最新行:

Name    Tx     TxDate   Other Columns
-------------------------------------------------------
A       3      1/4/2017
B       5      1/6/2017
C       8      1/9/2017

但是,我使用切片器来帮助过滤我们的日期,我想要切片数据中的最新行 . 例如,如果切片日期范围是1/1/2017到1/2/1017(含),我想显示:

Name    Tx     TxDate   Other Columns
-------------------------------------------------------
A       1      1/1/2017
C       7      1/2/2017

我一直试图通过创建一个带有DAX表达式的度量来计算每个名称的最新日期,然后添加一个过滤器来仅显示那些LatestTxDate = TxDate,但它不起作用:

LastTxDate = 
    MAXX(
        GROUPBY(
            Table,
            [Name],
            "Latest Tx Date", 
            MAXX(CURRENTGROUP(), Table[TxDate])
               ), 
        [Latest Tx Date]
         )

我的想法是,我计算一个新度量,然后只有在TxDate = LastTxDate时才能显示该行 .

Name    Tx     TxDate     LastTxDate  Other Columns
-------------------------------------------------------
A       1      1/1/2017   1/1/2017
A       2      1/3/2017   1/1/2017
A       3      1/4/2017   1/1/2017
B       4      1/5/2017
B       5      1/6/2017
C       6      1/1/2017   1/2/2017
C       7      1/2/2017   1/2/2017
C       8      1/9/2017   1/2/2017

这感觉很简单,但我尝试的一切都行不通 . 任何帮助表示赞赏 .

2 回答

  • 1

    我遇到了和你一样的问题,并花了整整一周时间试图解决它,因为我在互联网上找不到任何指南 . 所以我想我可以借给你一个手,即使这是9个月前被问到的 .

    首先要做的事情是:您需要使用 measures 执行此操作,因为它们会受到报表中的切片器和过滤器的影响 .

    在尝试了很多东西后,我想出了一个测量方法来检查每一行是否是每个组的最新行,然后该度量值将为“1” . 如果不是最后一行,则取值为“0” .

    这就是我设法做到这一点(注意:它不是那么简单):

    • 构建 calendar table ,范围从日期列的最小值到最大值 . 必须这样做,因为如果在接下来的步骤中使用日期列本身,数据将表现得很奇怪 . 此新表的列将在报告中用作 date slicer
    Calendar = CALENDAR(MIN('Table'[TxDate]); MAX('Table'[TxDate]))
    
    • 现在在数据表中创建一个新度量,它将过滤报表切片器中高于所选日期的日期,然后它将找到每个类别或组的最新日期:
    Check =
    VAR DateFilter = MAX('Calendar'[Date])
    VAR LastDate = CALCULATE(
        MAX('Table'[TxDate]);
        ALLEXCEPT(
            'Table';
            'Table'[Name]
        );
        'Table'[TxDate] <= DateFilter
    )
    RETURN IF(LASTNONBLANK('Table'[TxDate]; 1) = LastDate; 1; 0)
    

    如果您使用所有“表”列和LastDate作为度量构建一个可视化表,您将看到每一行将每个组的最新日期作为LastDate的值 . 像这样的东西:

    Name    Tx     TxDate     LastDate
    ---------------------------------------
    A       1      1/1/2017   1/4/2017
    A       2      1/3/2017   1/4/2017
    A       3      1/4/2017   1/4/2017
    B       4      1/5/2017   1/6/2017
    B       5      1/6/2017   1/6/2017
    C       6      1/1/2017   1/9/2017
    C       7      1/2/2017   1/9/2017
    C       8      1/9/2017   1/9/2017
    

    如果您的报告中有日期切片器,它将受到日期切片器的影响 . 所以这种行为是正确的 . 然后我使用公式LASTNONBLANK()为日期列提供行上下文,因此现在可以在TxDate和LastDate之间进行比较,如果两者相同,则Check将取值“1” .

    Name    Tx     TxDate     LastDate   Check
    ---------------------------------------------
    A       1      1/1/2017   1/4/2017   0
    A       2      1/3/2017   1/4/2017   0
    A       3      1/4/2017   1/4/2017   1
    B       4      1/5/2017   1/6/2017   0
    B       5      1/6/2017   1/6/2017   1
    C       6      1/1/2017   1/9/2017   0
    C       7      1/2/2017   1/9/2017   0
    C       8      1/9/2017   1/9/2017   1
    
    • [Check]度量目前无法在视觉图形中使用,因此我们需要创建另一个度量,它将只计算[Check]将值变为“1”的所有行 . 这是最简单的步骤,因为我们只需要一个SUMX来对已过滤表的所有行求和:
    Count of Tx = SUMX(
        FILTER('Table'; [Check] = 1);
        [Check]
    )
    

    现在,您拥有所有表行的总数,其中最近的日期在日期切片器给出的范围内 . 您可以在图形视觉中使用此度量来显示这些行中有多少对应于每个类别 . 例如,您可以构建一个饼图,显示有多少“名称”对于Tx具有值“3”,有多少具有值“5”,依此类推 .

    如果您想要一个表格视觉显示哪个是每个类别的最新日期,您可以使用[LastDate]作为这样的度量而不是[Check]:

    LastDate =
        VAR DateFilter = MAX('Calendar'[Date])
        RETURN CALCULATE(
            MAX('Table'[TxDate]);
            ALLEXCEPT(
                'Table';
                'Table'[Name]
            );
            'Table'[TxDate] <= DateFilter
        )
    

    如果您还需要一个度量来告诉您每个类别的最新Tx,您可以更改MAX('表'[TxDate])为MAX('表'[Tx]) . 有很多可能性 . 我的建议是你研究这些公式,这样你才能理解他们在每一步中做了什么,所以你可以根据自己的需要修改它们 . 您还可以将这两个度量结合起来,并获得一个像这样的表格:

    Name   LastTx   LastDate
    --------------------------
    A      3        1/4/2017
    B      5        1/6/2017
    C      8        1/9/2017
    

    希望这可以帮助你甚至在你问过9个月后,或者可能帮助其他人遇到与我们相同的问题 .

  • 0

    我认为你不需要那种幻想 . 以下适用于我 .

    LastTxDate = MAX(Table[TxDate])
    

    Edit:

    您还希望将最大值超过 Tx 值,而不是列出所有值 .

    MaxTx = MAX(Table[Tx])
    

    在表中使用两个 MAX 度量而不是将 Tx 视为另一个类别 .

相关问题