Как объединить источники в один?

У меня проблема при вызове конечной точки REST. Результирующий набор данных слишком велик для возврата конечной точки (я получаю ошибку HTTP 500). Я могу разбить запрос на части, например по месяцам. Как выполнить несколько вызовов конечной точки - по одному на каждый месяц, который я хочу вернуть, а затем объединить их в одну таблицу?

К сожалению, конечная точка 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

Я хочу, чтобы наборы результатов обоих запросов были объединены в "CompositeTable"


person Peter Rundqvist    schedule 12.06.2019    source источник


Ответы (1)


Есть отличная запись в блоге Марка Тидеманна Это подсказывает решение. Я применял этот метод десятки раз, и он безупречно работает для любого разбитого на страницы API, с которым я сталкивался.

Элегантное решение Марка состоит в том, чтобы запросить первую страницу, извлечь из нее общее количество результатов, а затем вызвать функцию 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
person David    schedule 12.06.2019
comment
Спасибо, Дэвид. Вы сделали мой день :) - person Peter Rundqvist; 13.06.2019
comment
Yupp! Спасибо еще раз :) - person Peter Rundqvist; 31.08.2019