如何将源合并为一个?

时间:2019-06-12 10:56:28

标签: powerbi powerquery m

调用REST端点时出现问题。结果数据集太大,端点无法返回(我收到HTTP 500错误)。 我可以将查询拆分为多个部分,例如按月。如何执行对端点的多次调用-我要返回的每个月一次,然后将它们组合到一个表中?

不幸的是,REST endpoind不支持ODATA查询,因此我无法分页浏览结果集。

Source1 = Json.Document(Web.Contents("https://someurl?theapi" & "&q=Date>='2019-01-01' AND Date<='2019-01-31'")),
Source2 = Json.Document(Web.Contents("https://someurl?theapi" & "&q=Date>='2019-02-01' AND Date<='2019-02-28'")),
Table1= Table.FromList(Source1, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
Table2= Table.FromList(Source2, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
CompositeTable= Table.NestedJoin(Table2, {"Datum"}, Table1, {"Datum"}, "CompositeTable", JoinKind.LeftOuter)

在     CompositeTable

我希望将两个查询的结果集合并到“ CompositeTable”中

1 个答案:

答案 0 :(得分:0)

有一个不错的blog post by Mark Tiedemann提出了解决方案。我已经应用了十多次这种方法,并且对于我遇到的任何分页API都可以完美地工作。

Mark的优雅解决方案是查询第一页,从第一页中提取总结果数,然后为其余所有页面调用GetPage函数,并使用List.Union函数合并所有页面。

对于您的用例,我将使用开始和结束日期,而不是项目/页面和总计项目。对于开始日期和结束日期之间的每个月,请调用仅查询该月的函数,然后合并结果。为了给您一个想法,像这样:

let 
    BaseUrl         = "https://someurl?theapi&",
    StartDate       = #date(2019,01,01),
    EndDate         = #date(2019,05,31),

    GetJson = (Url) =>
        let Json = Json.Document(Web.Contents(Url))
        in  Json,

    GetPage = (Index) =>
        let Start = "Date>=" & Text.From(Date.StartOfMonth(Index)),
            End   = "Date<=" & Text.From(Date.EndOfMonth(Index)),
            Url   = BaseUrl & "&q=" & Start " AND " & End,
            Json  = GetJson(Url),
            Value = Json[#"value"]
        in  Value,

    PageIndices = { LIST OF ALL MONTHS },
    Pages       = List.Transform(PageIndices, each GetPage(_)),
    Entities    = List.Union(Pages),
    Table       = Table.FromList(Entities, Splitter.SplitByNothing(), null, null, ExtraValues.Error)
in
    Table
相关问题