如何将源合并为一个?

How to combine sources into one?

我在调用 REST 端点时遇到问题。生成的数据集对于端点来说太大 return(我收到 HTTP 500 错误)。 我可以将查询分成几部分,例如按月。我如何对端点执行多次调用 - 每个月一次 return,然后将它们组合成一个 table?

很遗憾,REST 端点不支持 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"

有一个很棒的 blog post by Mark Tiedemann 提出了解决方案。这种方法我已经应用了十几次,它对我遇到的任何分页 API 都完美无缺。

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

对于您的用例,我会使用开始日期和结束日期,而不是 items/page 和项目总数。对于开始日期和结束日期之间的每个月,仅调用查询该月的函数,并合并结果。给你一个想法,像这样:

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