Фильтр по дате в PowerQuery (PowerBI) - PullRequest
0 голосов
/ 18 апреля 2019

В настоящее время я получаю большое количество данных из моей cosmosDB, которые я хочу сократить до последних 8 недель.

Как я могу фильтровать в PowerQuery для получения последних 8 недель на основе моего столбец даты.

Это мой запрос на получение данных:

let
    Source = DocumentDB.Contents("https://xxx.xxx", "xxx", "xxx"),
    #"Expanded Document" = Table.ExpandRecordColumn(Source, "Document", {"$v"}, {"Document.$v"}),
    #"Expanded Document.$v" = Table.ExpandRecordColumn(#"Expanded Document", "Document.$v", {"date"}, {"Document.$v.date"}),
    #"Expanded Document.$v.date" = Table.ExpandRecordColumn(#"Expanded Document.$v", "Document.$v.date", {"$v"}, {"Document.$v.date.$v"}),
    #"Changed Type" = Table.TransformColumnTypes(#"Expanded Document.$v.date",{{"Document.$v.date.$v", type text}})
in
    #"Changed Type"

И вот как данные находятся в моем CosmosDB:

{
"_id" : ObjectId("5c6144bdf7ce070001acc213"),
"date" : {
    "$date" : 1549792055030
},

1 Ответ

1 голос
/ 19 апреля 2019

Если вы хотите выполнить всю работу на своем конце (возможно, сервер может сделать часть / все):

  • Предполагая, что 1549792055030 (показанный в примере) является временной меткой Unix, выраженной в миллисекундах, чтобы преобразовать ее в datetime в Power Query, попробуйте что-то вроде: #datetime(1970, 1, 1, 0, 0, 0) + #duration(0, 0, 0, 1549792055030/1000)
  • Вы, кажется, расширяете поле записи с именем $v (которое само было вложено в поле с именем date, которое само было вложено в поле с именем $v) в вашем коде M, но $v не отображается как присутствующий в структуре. Я упоминаю об этом, потому что сложно понять, следует ли следовать вашему M коду или структуре. Я предполагаю, что у вас есть поле $v, которое содержит поле date, которое само содержит поле $date. Чтобы получить вложенную временную метку Unix, вы можете попробовать что-то вроде: someRecord[#"$v"][date][#"$date"]
  • Поскольку вас интересуют только последние 8 недель, вы можете проверить что-то вроде: Date.IsInPreviousNWeeks(DateTime.AddZone(someDatetime, 0), 8). (Вы также можете сделать это другим способом, преобразовав 8 weeks ago before now в метку времени Unix, а затем отфильтровав метки времени >= в значение, которое вы отработали.)

Собрав все вместе, мы можем получить код M, который выглядит следующим образом:

let
    Source = DocumentDB.Contents("https://xxx.xxx", "xxx", "xxx"),
    filterDates = Table.SelectRows(Source, each
        let
            millisecondsSinceEpoch = Number.From([document][#"$v"][date][#"$date"]),
            toDatetime = #datetime(1970, 1, 1, 0, 0, 0) + #duration(0, 0, 0, millisecondsSinceEpoch/1000),
            toFilter = Date.IsInPreviousNWeeks(DateTime.AddZone(toDatetime, 0), 8)
        in toFilter
    )
in filterDates

Приведенный выше код может быть функциональным (надеюсь), но концептуально это может быть неправильный способ сделать это. Я не знаком с функцией DocumentDB.Contents, но эта ссылка (https://www.powerquery.io/accessing-data/document-db/documentdb.contents) предполагает, что она имеет следующие параметры:

функция ( url как текст, необязательно база данных как обнуляемый любой, необязательно collection как nullable any, необязательные опции как nullable record) как таблица

и он продолжает:

если поле Query указано в опциях записи результатов запрос выполняется в указанной базе данных и / или коллекция будет возвращена.

Я понимаю, что это означает, что если вы измените свою первую строку на что-то вроде:

Source = DocumentDB.Contents("https://xxx.xxx", "xxx", "xxx", [Query = "..."])

и запрос, указанный в "...", понятен серверу (предположим, что запрос должен быть на родном языке запросов Cosmos DB), вам будут возвращены данные только за последние 8 недель (что означает меньшие потребности в данных) отправка и меньше работы для вас). Как я уже сказал, я не знаком с Azure Cosmos DB, поэтому не могу комментировать дальше. Но это, кажется, лучший способ сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...