在PowerQuery(PowerBI)中过滤日期

时间:2019-04-18 08:13:42

标签: filter powerquery

我目前正在从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 个答案:

答案 0 :(得分:1)

如果您想自己完成所有工作(也许服务器可以完成部分/全部工作):

  • 假设1549792055030(以示例形式显示)是以毫秒为单位的Unix时间戳,要在Power Query中转换为datetime,请尝试类似以下操作:#datetime(1970, 1, 1, 0, 0, 0) + #duration(0, 0, 0, 1549792055030/1000)
  • 您似乎在{{1}中扩展了一个名为$v的记录字段(它本身嵌套在名为date的字段中,它本身嵌套在名为$v的字段中) }}代码,但M未显示为存在于结构中。我之所以这样说是因为知道是否遵循您的$v代码或结构会造成混淆。我假设您有一个M字段,其中包含一个$v字段,该字段本身包含一个date字段。要获取嵌套的Unix时间戳,您可以尝试类似以下操作:$date
  • 由于您仅对最近8周感兴趣,因此可以测试以下内容:someRecord[#"$v"][date][#"$date"]。 (您也可以用另一种方法,将Date.IsInPreviousNWeeks(DateTime.AddZone(someDatetime, 0), 8)转换为Unix时间戳,然后过滤时间戳8 weeks ago before now为您计算出的值。)

将以上内容放在一起,我们可能会得到一些>=代码,如下所示:

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 不熟悉,但是此链接(https://www.powerquery.io/accessing-data/document-db/documentdb.contents)建议它具有以下参数:

  

功能( URL 为文本,可选的数据库为可为空的任意值,可选   集合作为可为空的任何,可选的选项作为可为空的记录)为   桌子

接着说:

  

如果在选项中指定了字段Query,则记录结果   在指定数据库和/或上执行查询   集合将被返回。

我的意思是,如果您将第一行更改为以下内容:

DocumentDB.Contents

,并且服务器可以理解您在Source = DocumentDB.Contents("https://xxx.xxx", "xxx", "xxx", [Query = "..."]) 中指定的查询(假设查询需要使用Cosmos DB的本机查询语言),只有最后8周的数据会返回给您(意味着数据需要发送,为您减少了工作量)。就像我说的那样,我不熟悉Azure Cosmos DB,因此我无法进一步发表评论。但这似乎是更好的方法。