如何从单个powerquery列中删除重复项而不删除整个行

时间:2019-05-21 20:28:17

标签: excel powerquery

我有一个数据表,其中记录了成本节省数据,每个项目有1行。它具有总体项目类型数据,例如年度支出,年度节省等,但也包含节省的月份。为了处理这些数据,我使用PowerQuery将其转换为表格,但重复了一些列,例如存在储蓄的每个月的年度支出,因此我可能会得到10行的储蓄是正确的,但是年度支出重复了10次。我可以只删除保留其他数据的那些列中的重复项吗?

我已经搜索并尝试了各种解决方案,但没有找到可行的解决方案。我没有设置数据表格式,所以可以打开任何东西。

下面是数据样本

Sample of Data Entry

PowerQuery示例

PowerQuery Results

正如您将看到的,每行都显示了“基线支出”,“协商支出”,“储蓄额”,我需要在数据透视/切片器中使用它们。

任何帮助将不胜感激。

此致

基思

1 个答案:

答案 0 :(得分:0)

我认为一个解决方案可能是“仅保留每个项目的前 1 个年度支出”。更抽象地讲,“仅将第一个列X的第一个值保留在Y列中”。

下面是一些模拟/虚拟数据。我只想将突出显示的值保留在annual spend列中(因为突出显示的值是每个“项目”的第一个“年度支出”数字)。

Example data

这是我用来实现此目的的M代码。 (要尝试,open the Query Editor > Advanced Editor (near top right) > copy-paste code below to there > OK)。

let
    OnlyKeepFirstValueInColumn = (someTable as table, columnsToNullify as list) as table =>
        let
            firstRow = Table.FirstN(someTable, 1), // This assumes first row contains a non-blank value.
            remainingRows = Table.Skip(someTable, 1),
            loopAndNullify = List.Accumulate(columnsToNullify, remainingRows, (tableState, currentHeader) => Table.TransformColumns(tableState, {{currentHeader, each null}})),
            combined = firstRow & loopAndNullify
        in combined,
    FirstValueOfColumnsPerGroup = (someTable as table, groupByColumns as list, columnsToNullify as list) =>
        let
            group = Table.Group(someTable, groupByColumns, {{"toCombine", each OnlyKeepFirstValueInColumn(_, columnsToNullify), type table}}),
            combined = Table.Combine(group[toCombine])
        in combined,
    aggregatedTable = Table.FromColumns({Text.ToList("aaabbbccccdddeeefg"), List.Repeat({1000}, Text.Length("aaabbbccccdddeeefg"))}, type table [project=text, annual spend=number]),
    transformed = FirstValueOfColumnsPerGroup(aggregatedTable, {"project"}, {"annual spend"})
in
    transformed

要理解的重要一点是这一行:

transformed = FirstValueOfColumnsPerGroup(aggregatedTable, {"project"}, {"annual spend"})

您应在其中替换的

  • aggregatedTable,其中包含表的任何变量/表达式
  • {"project"}和“项目”列的名称相同(请保留大括号{},因为如果需要的话,它们可以让您通过几列)
  • {"annual spend"},其中要保留第一个值的列的名称(保留大括号{}

这就是我得到的(我认为与您想要的类似):

Output result


1 为简单起见,我们说“ first”是指第一行中的值。它本来可以表示“第一个非空值”或“满足某些特定条件或逻辑的第一个值”,但您的数据表明,更简单的定义可以正常工作。