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

时间:2018-02-01 14:16:26

标签: powerbi dax

我在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 个答案:

答案 0 :(得分:1)

我遇到了与您相同的问题,花了整整一个星期的时间来解决它,因为我在互联网上找不到任何指南。因此,即使这是9个月前提出的请求,我也想可以帮忙。

第一件事:您需要使用措施来执行此操作,因为这是在PowerBI报表中动态计算的唯一内容。如果在查询编辑器中使用计算列或M公式,则仅在刷新数据时才计算该列或M公式。它们将不受报告中的切片器和过滤器的影响。

尝试了很多东西之后,我想到了进行度量的想法,该度量检查每一行是否是每个组的最新行,那么度量将取值为'1'。如果不是最后一行,它将取值'0'。

这就是我设法做到的方式(注意:这不是那么简单):

  1. 构建一个日历表,范围从日期列的最小值到最大值。之所以必须这样做,是因为如果在下一步中使用date列本身,则数据的行为会很奇怪。此新表的列将用作报告中的日期切片器

    Calendar = CALENDAR(MIN('Table'[TxDate]); MAX('Table'[TxDate]))
    
  2. 现在在数据表中创建一个新度量,该新度量将过滤比报表切片器中所选日期高的日期,然后为每个类别或组找到最新日期:

    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()为date列提供行上下文,从而现在可以在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
    
  3. [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('Table'[TxDate])更改为MAX('Table'[Tx])。有很多可能性。我的建议是,您应该研究这些公式,以便了解它们在每个步骤中的作用,因此可以根据需要对其进行修改。 您还可以将这两种方法结合起来,得到一个像这样的表格:

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

希望这在您问了9个月后就可以为您提供帮助,或者可以帮助遇到与我们同样的问题的其他人。

答案 1 :(得分:0)

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

LastTxDate = MAX(Table[TxDate])

修改

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

MaxTx = MAX(Table[Tx])

在表格中使用MAX个衡量标准,而不是将Tx视为另一个类别。