覆盖与补全

题目:


将替换区的数据,挨个按顺序替换源数据,多出的补全在下面,需保持原来的顺序。
 

解法:

let
    待替换= Excel.CurrentWorkbook(){[Name="表2"]}[Content],
    源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
    加索引 = Table.AddIndexColumn(源, "索引", 0, 1),
    分组 = Table.Group(加索引,"项目",{"a",each Table.ToColumns(_)}),
    合并 = Table.NestedJoin(分组,"项目",待替换,"项目","b",1),
    自定义 = Table.AddColumn(合并, "自定义", each Table.FillDown(Table.FromColumns({[a]{0},[b][数据]&List.Skip([a]{1},Table.RowCount([b])),[a]{2}},Table.ColumnNames(加索引)),{"项目","索引"})),
    展开 = Table.ExpandTableColumn(自定义, "自定义", {"数据", "索引"}, {"数据", "索引"}),
    排序 = Table.Sort(展开,{"索引", 0}),
    还原 = Table.SelectColumns(排序,{"项目", "数据"})
in
    还原

方法待优化,如有其他好的方法或思路欢迎留言。

附件

10 Replies to “覆盖与补全”

      1. 两个表分别添加索引列,以索引列和项目为依据全部外连接合并查询后,构建新数据列然后选择相应列就可以吧。

  1. 大神,你的结果不能显示F那一行,原因还不太清楚。请帮忙优化一下我的代码,谢谢。
    let
    Source = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
    b = Table.Combine(Table.Group(Excel.CurrentWorkbook(){[Name="表2"]}[Content],"项目",{"n", each Table.AddIndexColumn(_,"idx",1)})[n]),
    a = Table.Combine(Table.Group(Table.AddIndexColumn(Table.TransformColumnTypes(Source,{{"项目", type text}, {"数据", Int64.Type}}),"Index",1),"项目",{"n",each Table.AddIndexColumn(_,"idx",1)})[n]),
    r = Table.RemoveColumns(Table.Sort(Table.FromRecords(List.Transform(Table.ToRecords(a), each _& (try Table.SelectRows(b,(x)=>x[idx]=_[idx] and x[项目]=_[项目]){0} otherwise []))),"Index"),{"Index","idx"}),
    c = Table.RemoveColumns(Table.SelectRows(Table.NestedJoin(b,{"项目","idx"},a,{"项目","idx"},"x",JoinKind.LeftOuter),each Table.RowCount(_[x])=0),{"idx","x"}),
    f = r&c
    in
    f

  2. let
    表1 = Table.Sort(Table.ExpandTableColumn(Table.Group(Table.AddIndexColumn(Excel.CurrentWorkbook(){[Name="表1"]}[Content],"Index"),"项目",{"index",each Table.AddIndexColumn(_,"_idx",1)}),"index",{"数据","Index","_idx"}),"Index"),
    表2 = Table.Sort(Table.ExpandTableColumn(Table.Group(Table.AddIndexColumn(Excel.CurrentWorkbook(){[Name="表2"]}[Content],"Index"),"项目",{"index",each Table.AddIndexColumn(_,"_idx",1)}),"index",{"数据","Index","_idx"}),"Index"),
    替换表1的数据 = Table.RenameColumns(Table.SelectColumns(Table.AddColumn(表1,"新数据",(x)=>if Table.Contains(表2,[项目=x[项目],_idx=x[_idx]]) then Table.SelectRows(表2,each [项目]=x[项目] and [_idx]=x[_idx])[数据]{0} else x[数据]),{"项目","新数据"}),{"新数据","数据"}),
    #"表2中有,表1中没有" = Table.SelectColumns(Table.SelectRows(表2,each Table.Contains(表1,[项目=[项目],_idx=[_idx]])=false),{"项目","数据"}),
    结果 =替换表1的数据 & #"表2中有,表1中没有"
    in
    结果

  3. 关于这题的重点,我的理解是怎么对每一行的 [项目] 进行累计计数。先对表1和表2分别进行累计计数,然后再进行合并查询就OK了。

    至于怎么算累计计数,除了分组,还可以用Table.ReplaceValue来做,相比用分组,它的好处是不用变数据结构。

    以表1为例:

    let
    源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
    索引 = Table.AddIndexColumn(源, "索引", 1, 1),
    索引替换为累计 = Table.ReplaceValue(索引,索引[项目],each [项目],(x,y,z)=>List.Count(List.PositionOf(List.FirstN(y,x),z,2))
    ,{"索引"})
    in
    索引替换为累计

  4. 老师这个方法有点问题像是还没做完。显示出来的数据,除了索引列有区别,其他的和原表一样并没有产生替换。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注