【问题标题】:Merge Query Matching on Dates in Multiple Rows合并多行日期的查询匹配
【发布时间】:2019-04-09 18:45:51
【问题描述】:

我正在尝试合并 Power BI Desktop 中的 2 个查询,将一个查询中基于用户和日期列的行与另一个查询中的行匹配,其中用户匹配且第二个查询中的日期最接近在第一个查询中的日期之前一个。

在其他需要匹配多个列的情况下,我通常会创建一个复合键来匹配,但这里不是直接匹配。

这 2 个查询的示例是:

QUERY1

User     Activity     Activity Date
User 1   Activity 1   2019-01-24
User 1   Activity 2   2019-03-03
User 1   Activity 3   2019-04-17

QUERY2

User     Status     Status Change Date
User 1   Status 1   2019-02-05
User 1   Status 2   2019-03-06
User 1   Status 3   2019-04-05

我正在寻找的合并查询是:

合并查询

User     Activity     Activity Date   Status
User 1   Activity 1   2019-01-24       
User 1   Activity 2   2019-03-03      Status 1
User 1   Activity 3   2019-04-17      Status 3

这两个查询都源自 REST API。如果它是 SQL 源,我会使用 SQL 查询来创建基于 Query2 的开始和停止日期的派生岛表,并对 Query1 执行 BETWEEN 联接,并将其作为 Power BI 的源。

在 Power Query 编辑器中,如何获得合并的查询结果?

【问题讨论】:

    标签: powerbi powerquery m


    【解决方案1】:

    首先,您要按照您的建议进行操作,并将状态表修改为具有开始和停止日期,而不是 Status Change Date。您可以通过排序、索引和自合并来完成此操作,正如我之前解释过的 herehere

    一旦你有了它,你就可以在每一行中加载状态表的副本,并使用UserDate 列来过滤表,最后为Status 返回一个值。

    let
        Source = <Query1 Source>
        #"Added Custom" =
        Table.AddColumn(Source, "Status",
            (C) => List.First(
                       Table.SelectRows(Status, 
                           each [User] = C[User] and 
                                [Start] < C[Date] and
                                ([Stop] = null or C[Date] <= [Stop])
                       )[Status]
                   ),
            type text)
    in
        #"Added Custom"
    

    这表示我们获取Status 表并对其进行过滤,以便根据当前行匹配User 并且Date 介于StartStop 之间。从该过滤表中,我们选择 Status 列,这是一个列表数据类型,因此我们选择列表的第一个元素来获取列表中唯一成员的文本值。

    【讨论】:

    • 稍微调整了 2 个链接中提供的示例 - 必须更改索引开始,因此最后一个范围的结束日期为空。 PBIX 完整解决方案
    猜你喜欢
    • 2020-03-28
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多