2

我在 Excel 中使用 Power Query 来引用同一工作簿中的表。我想选择该表中的特定列。我知道这可以通过将表加载到 Power Query 中然后选择我要使用的列来完成。结果查询是:

let
    Source = Excel.CurrentWorkbook(){[Name="Legend_Data_Merged"]}[Content],
    #"Removed Other Columns" = Table.SelectColumns(
        Source,
        {
            "Observation number",
            "First Sales Offer - Products",
            "Middle Sales Offer(s) - Products",
            "Last Sales Offer - Products"
        }
    )
in
    #"Removed Other Columns"`

所以,这是我的问题/问题:

我认为这种方式是首先将整个表拉入 Power Query,然后从那里剥离。我想要做的是将源表定义为“Legend_Data_Merged”表,但选择在同一操作中从该表中提取哪些列。这样,它永远不必将整个表加载到 Power Query 中。原因是表本身大约有 120 列长,而我只需要三列,而且我有大约 20 个这样的类似查询并且它开始占用内存。我在这里的逻辑错了吗?如果没有,有人知道查询是什么吗?

是否有办法在源操作的 [content] 部分定义列?

谢谢。

4

3 回答 3

1

这可能是一个非常简单的尝试,但为什么不添加一个工作表“DataTransfer”,您只设置对您需要的列的引用并使用强大的查询读取这个小表?

如果您的列靠得很近,您还可以设置一个命名范围并使用 powerquery 仅读取此范围。

但是无论如何,当工作簿打开时,您的大表已经在内存中。使用 powerquery 读取表并选择三列时,不应分配太多内存。

于 2015-09-02T17:49:12.903 回答
0

你可以在这里参考我的问答。

您要做的是使用该Table.SelectColumns方法而不是 Remove。

let
    db = Sql.Databases("sqlserver.database.url"){[Name="DatabaseName"]}[Data],
    Sales_vDimCustomer = Table.SelectColumns(
        db{[Schema="Sales",Item="vDimCustomer"]}[Data],
        {
            "Name",
            "Representative",
            "Status",
            "DateLastModified",
            "UserLastModified",
            "ExtractionDate"
        }
    )
in
    Sales_vDimCustomer

当使用 Express Profiler 查看原始 sql 时,它将在一个语句中完成,其中

SELECT
       $Table.Name,
       $Table.Representative,
       $Table.Status,
       $Table.DateLastModified, 
       $Table.UserLastModified,
       $Table.ExtractionDate
FROM
       Sales.vDimCustomer as $Table

现在,当尝试导入大量列时,PowerBi 和 Power Query 也会显示带有此建议的错误/警告消息。

于 2016-01-29T04:51:35.060 回答
0

Excel 或 Power Query 中可能存在问题。您看到 excel.exe 和 Microsoft.Mashup.Container.NetFX40.exe 进程使用了​​多少内存?

直接从中删除列的唯一方法[Content]是修改 Excel 表的实际数据。您可以尝试这样做,看看它是否有所作为,但 Power Query 通常会尝试聪明地只加载它需要的列。

如果您的查询使用大量内存,您可能会以更有效的格式保存数据(我会尝试 CSV)。无论如何,请尝试关闭“加载到工作表”,而只是加载到数据模型。

于 2015-09-01T09:54:54.937 回答