首页 > 解决方案 > 在 DAX(不是 powerquery)中,根据列删除重复项

问题描述

在我的 PowerBI 桌面中,我有一个表格,该表格是根据其他表格计算得出的,其结构如下:

输入表:

<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th>Firstname</th>
      <th>Email</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Scott</td>
      <td>ABC@XYZ.com</td>
    </tr>
    <tr>
      <td>Bob</td>
      <td>ABC@XYZ.com</td>
    </tr>
    <tr>
      <td>Ted</td>
      <td>ABC@XYZ.com</td>
    </tr>
    <tr>
      <td>Scott</td>
      <td>EDF@XYZ.com</td>
    </tr>
    <tr>
      <td>Scott</td>
      <td>LMN@QRS.com</td>
    </tr>
    <tr>
      <td>Bill</td>
      <td>LMN@QRS.com</td>
    </tr>
  </tbody>
</table>

现在,我只想保留每封唯一电子邮件的第一条记录。我使用 DAX 的预期输出表是:

<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th>Firstname</th>
      <th>Email</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Scott</td>
      <td>ABC@XYZ.com</td>
    </tr>
    <tr>
      <td>Scott</td>
      <td>EDF@XYZ.com</td>
    </tr>
    <tr>
      <td>Scott</td>
      <td>LMN@QRS.com</td>
    </tr>
  </tbody>
</table>

我试图使用 RANKX 和 FILTER,但没有任何成功。

标签: powerbidaxpowerbi-desktop

解决方案


可悲的是,这个问题的答案是 DAX 中无法引用相对于表中其他行的行位置。唯一的选择是使用某些列值进行排序。

我们可以使用现有的两列表来获取每封电子邮件的 MAX 或 MIN Firstname。所以我们可以写一个如下的计算表,其中T是输入表,T Unique是生成表。

T Unique = 
ADDCOLUMNS(
    ALL( T[Email] ),
    "Firstname",
        CALCULATE(
            MAX( T[Firstname ] )
        )
)

T 独特的

但这并不能满足要求。

为了获得所需的结果,我们需要在输入表中添加一列,带有索引或时间戳。

对于此示例,我在 Power Query 中使用以下 M 代码添加了一个索引列,该代码是通过引用原始表然后单击添加列 -> 索引列按钮自动生成的

let
    Source = T,
    #"Added Index" = Table.AddIndexColumn(Source, "Index", 1, 1, Int64.Type)
in
    #"Added Index"

所以我得到了T Index这张桌子。

T 索引表

现在我们可以编写下面的计算表,它使用新列来检索每个电子邮件的第一行

T Index Unique = 
ADDCOLUMNS(
    ALL( 'T Index'[Email] ),
    "Firstname",
        VAR MinIndex =
            CALCULATE(
                MIN( 'T Index'[Index] )
            )
        RETURN
            CALCULATE(
                MAX( 'T Index'[Firstname ] ),
                'T Index'[Index] = MinIndex
            )
)

生成请求的表

T 索引唯一表

在真实案例场景中,添加新列的最佳位置是直接在生成输入表的代码中。


推荐阅读