自 2017 年 4 月发布的 Power BI Desktop 起,只需提供新列的一个或多个示例值,即可使用查询编辑器向模型添加新的数据列。 可以根据当前所选内容,或通过根据给定表中的所有(或选定)列提供输入数据,创建新列示例。

这种方法有助于轻松快速地创建新列,非常适用于以下情形:

  • 你知道自己想要在新列中获得的数据结果,但不确定通过哪种转换(或一系列转换)可以实现目的。
  • 你已知道自己需要执行的转换,但不确定在 UI 中的什么位置进行单击或选择,从而执行这些转换。
  • 你知道在“M”中使用“自定义列”表达式所需的转换的全部信息,但无法在 UI 中单击或添加其中一个(或多个)表达式。

通过示例添加列功能使用起来非常简单。 在接下来的几个部分中,我们就来看看如何轻松地使用这项功能。

使用查询编辑器通过示例添加新列

若要通过示例创建新列,请启动“查询编辑器”。 为此,可以在 Power BI Desktop 的“开始”功能区中选择“编辑查询”。

在本文中,我们将使用以下维基百科文章中的数据(可以单击下面的链接,自行获取数据,然后跟着我们一起操作):

启动“查询编辑器”且已加载部分数据后,便可以开始通过示例添加列。 若要添加新列,请在“查询编辑器”中依次选择功能区上的“添加列”选项卡和“通过示例添加列”。 可以选择下拉列表中的“通过所有列”(如果只选择了按钮,而未选择下拉列表,此为默认值)或“通过所选内容”。 在本文中,我们将一步步演示选择“通过所有列”的相关操作。

“通过示例添加列”窗格

选择通过示例添加新列后,便会看到一个新窗格,其中显示了当前表中的列(可能需要滚动才能查看全部列)。 右侧还会显示新的“第 1 列”,这就是 Power BI Desktop 根据示例创建的列。 新的“第 1 列”标题下方是空白单元格,可以在其中键入示例,以便 Power BI 能够用来创建与示例匹配的规则和转换。

另请注意,这是“查询设置”窗格中的“已应用步骤”。 和以往一样,查询编辑器会记录转换步骤,并依序向查询应用这些步骤。

这就是“通过示例添加列”窗格,主要分为以下四个区域:

  1. 包含功能或转换的简要说明的“命令栏”。
  2. 有助于 Power BI 改进此功能的“发送反馈”选项。
  3. 用于提交转换并添加列或取消上述操作的“确定”和“取消”按钮。
  4. 新列区域,可以在任意一行中键入示例值(向 Power BI 提供示例),从而与相应行的其他列相关联。

在新列中键入示例时,Power BI 会根据检测到的转换让你预览要创建的列。 例如,我们在第一行中键入了“Alabama”,对应于表中第一列的“Alabama”值。 按 Enter 键后,Power BI 便会立即根据此值填充列。

不过,接着我们转到包含“Massachusetts[E]”的行,并删除了最后的“[E]”部分(因为我们不需要这一部分),Power BI 检测到了这一更改,并使用示例创建了转换。 请注意,窗格的中上方对转换进行了说明。

如果继续提供示例,查询编辑器会将其添加到转换中。 如果感到满意,可以选择“确定”提交更改。

观看“通过示例添加列”的实际操作

想看看此功能的实际效果? 下面的视频展示了这项功能的实际运用(使用此示例前面提供的数据源)。 请仔细观看,自己跟着视频操作一下!

注意事项和限制

虽然使用“通过示例添加列”时有许多转换可用,但并不是所有转换都包含在内。 下面列出了*支持*的全部转换。

  • 引用

    • 引用特定列(包含截断和大小写转换)
  • 文本转换

    • Text.Combine(支持合并文本字符串和整个列值)
    • Text.Replace
    • Text.Start
    • Text.Middle
    • Text.End
    • Text.BeforeDelimiter
    • Text.AfterDelimiter
    • Text.BetweenDelimiters

    注意:对于所有*文本*转换,都要考虑是否可能需要截断或对列值应用大小写转换。

  • 日期转换

    • Date.Day
    • Date.DayOfWeek
    • Date.DayOfWeekName
    • Date.DayOfYear
    • Date.Month
    • Date.MonthName
    • Date.QuarterOfYear
    • Date.WeekOfMonth
    • Date.WeekOfYear
    • Date.Year
  • 时间转换

    • Time.Hour
    • Time.Minute
    • Time.Second

    注意:对于所有*日期*和*时间*转换,都要考虑是否可能需要将列值转换成*日期*或*时间*或*日期和时间*。