在 Power BI 中清理 table

Clean up table in Power BI

我正在尝试将几个 Excel 文件加载到 Power BI 中。这些文件非常小(<= ~1k 行)。必须清理这些来源之一。特别是,其中一个列有一些错误数据。正确的数据存储在另一个 Excel 文件中。例如:

table bad:
ID    col1
1     0
2     0.5
3     2
4     -3

table correct:
ID    colx
2     1
4     5

desired output:
ID    col1
1     0
2     1
3     2
4     5

在 SQL 或其他数据可视化工具中,我会将错误的 table 加入到干净的 table 中,然后合并错误的值和正确的值。我知道我有一些关于如何在 Power BI 中实现它的选项。我认为一种选择是在查询编辑器(即 M)中实现它。我认为另一种选择是在数据模型(即 DAX)中实现它。哪个选项最好?并且,实现会是什么样子(例如,如果是 M,那么查询会是什么样子)?

虽然您可以在 DAX 中执行此操作,但我建议在查询编辑器中执行此操作。这些步骤大致如下所示:

  1. 使用 ID columns.
  2. 上的左外连接将 Correct table 合并到 Bad table

  1. 展开 Correct table 得到 Colx 列。

  1. 创建自定义列以选择所需的值。 (添加列 > 自定义列)

    if [Colx] = null then [Col1] else [Colx]

  1. 如果需要,您可以删除 Col1Colx 列,也可以保留它们。如果删除 Col1,则可以将 Col2 列重命名为 Col1

如果您不希望源 table 到处浮动,您可以在类似于此的单个查询中完成上述所有操作:

let
    BadSource = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlTSUTJQitWJVjICsfRMwWxjINsIzDIBsnSNlWJjAQ==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [ID = _t, Col1 = _t]),
    CorrectSource = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlLSUTJUitWJVjIBskyVYmMB", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [ID = _t, Colx = _t]),
    Bad = Table.TransformColumnTypes(BadSource,{{"ID", Int64.Type}, {"Col1", type number}}),
    Correct = Table.TransformColumnTypes(CorrectSource,{{"ID", Int64.Type}, {"Colx", type number}}),
    #"Merged Queries" = Table.NestedJoin(Bad,{"ID"},Correct,{"ID"},"Correct",JoinKind.LeftOuter),
    #"Expanded Correct" = Table.ExpandTableColumn(#"Merged Queries", "Correct", {"Colx"}, {"Colx"}),
    #"Added Custom" = Table.AddColumn(#"Expanded Correct", "Col2", each if [Colx] = null then [Col1] else [Colx]),
    #"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Col1", "Colx"}),
    #"Renamed Columns" = Table.RenameColumns(#"Removed Columns",{{"Col2", "Col1"}})
in
    #"Renamed Columns"