Power BI DAX 计算筛选行的最新值

Dan*_*Dan 2 dax powerbi

我在 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
Run Code Online (Sandbox Code Playgroud)

在表格视觉中,我只想显示每个名称的最新行:

Name    Tx     TxDate   Other Columns
-------------------------------------------------------
A       3      1/4/2017
B       5      1/6/2017
C       8      1/9/2017
Run Code Online (Sandbox Code Playgroud)

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

Name    Tx     TxDate   Other Columns
-------------------------------------------------------
A       1      1/1/2017
C       7      1/2/2017
Run Code Online (Sandbox Code Playgroud)

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

LastTxDate = 
    MAXX(
        GROUPBY(
            Table,
            [Name],
            "Latest Tx Date", 
            MAXX(CURRENTGROUP(), Table[TxDate])
               ), 
        [Latest Tx Date]
         )
Run Code Online (Sandbox Code Playgroud)

这个想法是我计算一个新的度量,然后只有在 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
Run Code Online (Sandbox Code Playgroud)

这感觉非常简单,但我尝试过的所有方法都不起作用。任何帮助表示赞赏。

R. *_*hez 6

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

首先第一件事情:你需要做到这一点的措施,因为他们是被动态地PowerBI报告中计算出的唯一的事情。如果您在查询编辑器中使用计算列或 M 公式,则只会在您刷新数据时进行计算。它们不会受到报告中的切片器和过滤器的影响。

在尝试了很多东西之后,我想到了做一个度量来检查每一行是否是每个组的最新行,然后度量将取值为“1”。如果它不是最后一行,它将采用值“0”。

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

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

    Calendar = CALENDAR(MIN('Table'[TxDate]); MAX('Table'[TxDate]))
    
    Run Code Online (Sandbox Code Playgroud)
  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)
    
    Run Code Online (Sandbox Code Playgroud)

    如果您使用所有“表格”列和 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
    
    Run Code Online (Sandbox Code Playgroud)

    如果您的报告中有日期切片器,它将受到日期切片器的影响。所以这种行为是正确的。然后我使用公式 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
    
    Run Code Online (Sandbox Code Playgroud)
  3. [Check] 度量目前不能用于图形可视化,因此我们需要创建另一个度量,该度量将仅计算 [Check] 取值为 '1' 的所有行。这是最简单的步骤,因为我们只需要一个 SUMX 来对过滤表的所有行求和:

    Count of Tx = SUMX(
        FILTER('Table'; [Check] = 1);
        [Check]
    )
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

如果您还需要一个度量来告诉您每个类别的最新 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
Run Code Online (Sandbox Code Playgroud)

希望这能在您提出要求 9 个月后对您有所帮助,或者可以帮助与我们遇到相同问题的其他人。