附加到现有表的Power Query

时间:2016-11-29 10:18:07

标签: excel powerquery

我最近切换到PowerQuery从各种来源获取数据。我已将现有数据加载到名为" masterEntries"。

的表中

我调用了一个函数来检查" masterEntries"中每个源的最后一条记录。并且只获取较新的记录。

let
    Source = Excel.CurrentWorkbook(){[Name="formsMaster"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"FormName", type text}, {"Form", type text}, {"LastEntry", Int64.Type}}),
    #"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", each formEntries([FormName],[LastEntry])),
    #"Expanded Custom" = Table.ExpandTableColumn(#"Added Custom", "Custom", {"EntryId", "Field1", "Field2", "Field3", "Field5", "DateCreated"}, {"EntryId", "Field1", "Field2", "Field3", "Field5", "DateCreated"}),
    #"Removed Columns" = Table.RemoveColumns(#"Expanded Custom",{"Form", "LastEntry"}),
in
    #"Removed Columns"

此查询将数据加载到新表。相反,我想将数据附加到" masterEntries"。

我试图用PowerQuery而不是VBA来做这件事。 PowerQuery具有追加查询功能,其中两个或多个查询/结果可以组合到新表中。

即使是将上述查询(" latestEntries")中的结果表附加到现有表(" masterEntries")的新查询也可以。

关于如何使用PowerQuery完成任何想法?

修改

  1. 手动加载了我的原始数据(" masterEntries")。这是一张有400K +记录的大桌子。我可以使用查询加载它,如果这将有所帮助。
  2. 每次运行" latestEntries"检查已经存在的记录" masterEntries"并且仅从不同来源获取较新的条目。
  3. Power Query中的Append Query方法只是一个连接。它不会永久追加记录。也就是说,当" latestEntries"带来了一组新的记录," masterEntries"丢失先前运行的" latestEntries"。
  4. 中的记录

3 个答案:

答案 0 :(得分:1)

这听起来有点像“增量加载”的请求。 Excel中的Power Query当前不支持此功能。解决方法是通过像此处所述的“linkback”表:http://ms-olap.blogspot.de/2015/05/incremental-data-loads-in-microsoft.html

如果您的linkback-table超过1,100万行,您可以使用如下所述的JSON压缩:http://www.thebiccountant.com/2016/12/06/how-to-store-tables-longer-than-11-mio-rows-in-excel/ 但请注意,这会降低性能。

这两种方法都“降低了”性能,所以这种技术才有意义,如果你“保存”重复执行非常繁重的转换(或从网络上长时间加载)。

答案 1 :(得分:0)

您应该添加这样的内容,只需将Your_Table的名称更改为您要使用的表格:

    #"Append Query" = Table.Combine({#"Removed Columns", Your_Table})
in
    #"Append Query"

答案 2 :(得分:0)

假设你有某种ID,并且它是整数,这里是 masterEntries 表的查询(这很重要!):

let
    Source = Excel.CurrentWorkbook(){[Name="masterEntries"]}[Content],
    Types = Table.TransformColumnTypes(Source,{{"ID", Int64.Type}, {"Value", type number}}),

    //Assuming you have integer-type IDs. 
    //Otherwise you have to order and index records in a view, and query that view.
    MaxID = List.Max(Types[ID]), 
    //if you have ordered index, List.Max() can be substituted with Table.LastN(Types, 1)[ID]{0}
    //it may perform better.

    TableFromDB = Excel.CurrentWorkbook(){[Name="source"]}[Content], //Replace with database table
    GetNewRows = Table.SelectRows(TableFromDB, each [ID] > MaxID),
    MergeTables = Table.Combine({Types, GetNewRows})
in
    MergeTables