You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Power Query合并后仍加载已过滤数据的问题求助

问题描述

我有三列数据:Item、Effective Date(商品定价记录日期)和Price。需要基于Item列合并三个独立查询,每个查询都做了特定日期过滤:

  • 查询1:取每个Item的最新日期记录
  • 查询2:取日期在指定范围内的记录
  • 查询3:取2023年3月1日之前的记录

单独运行三个查询时结果都正确,但合并后原本已过滤的旧日期数据被引入。比如商品ABC123在查询1中应该显示2024/2/6的最新记录,但合并后却显示了最旧的2018/2/18记录。我在主表中对日期列做了降序排序并建立索引,推测合并时排序规则被清除。

合并后的M代码:

let
    Source = Table.NestedJoin(#"itemprice_mst - Master", {"item"}, #"itemprice_mst - Master (2)", {"item"}, "itemprice_mst - Master (2)", JoinKind.LeftOuter),
    #"Expanded itemprice_mst - Master (2)" = Table.ExpandTableColumn(Source, "itemprice_mst - Master (2)", {"effect_date", "unit_price2", "Index"}, {"effect_date.1", "unit_price2.1", "Index.1"})
in
    #"Expanded itemprice_mst - Master (2)"

查询1(取最新日期)的M代码(合并前正确):

let
    Source = Sql.Database("infor-query", "prod_app_data"),
    dbo_itemprice_mst = Source{[Schema="dbo",Item="itemprice_mst"]}[Data],
    #"Removed Other Columns" = Table.SelectColumns(dbo_itemprice_mst,{"item", "effect_date", "unit_price2"}),
    #"Changed Type" = Table.TransformColumnTypes(#"Removed Other Columns",{{"effect_date", type date}}),
    #"Sorted Rows" = Table.Sort(#"Changed Type",{{"item", Order.Ascending}, {"effect_date", Order.Descending}}),
    #"Grouped Rows" = Table.Group(#"Sorted Rows", {"item"}, {{"Count", each _, type table [item=text, effect_date=nullable date, unit_price2=nullable number]}}),
    #"Added Custom" = Table.AddColumn(#"Grouped Rows", "Custom", each Table.AddIndexColumn([Count],"Index",1)),
    #"Removed Other Columns1" = Table.SelectColumns(#"Added Custom",{"Custom"}),
    #"Expanded Custom" = Table.ExpandTableColumn(#"Removed Other Columns1", "Custom", {"item", "effect_date", "unit_price2", "Index"}, {"item", "effect_date", "unit_price2", "Index"}),
    #"Changed Type1" = Table.TransformColumnTypes(#"Expanded Custom",{{"effect_date", type date}, {"unit_price2", type number}, {"Index", Int64.Type}}),
    #"Filtered Rows" = Table.SelectRows(#"Changed Type1", each ([Index] = 1))
in
    #"Filtered Rows"

关键现象:合并展开前嵌套表中的数据是正确的,但展开后出现了已被过滤掉的旧日期数据。


原因分析

问题出在嵌套连接后的展开逻辑:当使用Table.NestedJoin时,即使子查询已经是过滤后的单条记录,展开时Power Query可能会意外关联到原表中未过滤的同Item记录(而非子查询的结果),或者因为索引/排序在连接过程中未被正确保留,导致展开时取到了不符合过滤条件的数据。

另外,当前查询1的逻辑过于复杂,分组+索引的操作存在潜在的稳定性问题,容易在连接环节丢失过滤规则。


解决方案

步骤1:优化单个过滤查询(以查询1为例)

用Table.Max直接获取每个Item的最大日期记录,简化逻辑的同时确保结果稳定:

let
    Source = Sql.Database("infor-query", "prod_app_data"),
    dbo_itemprice_mst = Source{[Schema="dbo",Item="itemprice_mst"]}[Data],
    #"Select Relevant Columns" = Table.SelectColumns(dbo_itemprice_mst,{"item", "effect_date", "unit_price2"}),
    #"Change Date Type" = Table.TransformColumnTypes(#"Select Relevant Columns",{{"effect_date", type date}}),
    #"Group by Item" = Table.Group(#"Change Date Type", {"item"}, {
        {"Latest Record", each Table.Max(_, "effect_date"), type record}
    }),
    #"Expand Latest Record" = Table.ExpandRecordColumn(#"Group by Item", "Latest Record", {"effect_date", "unit_price2"}, {"Latest_effect_date", "Latest_unit_price"})
in
    #"Expand Latest Record"

同理优化另外两个查询,确保每个查询输出的结果中每个Item仅对应一条符合条件的记录。

步骤2:合并三个过滤后的查询

直接使用Table.Join进行平级合并,避免嵌套连接展开时的异常:

假设三个优化后的查询分别命名为:

  • Query_Latest(取最新日期)
  • Query_DateRange(指定日期范围)
  • Query_Before20230301(2023-03-01之前)

合并代码如下:

let
    // 合并最新记录和日期范围记录
    Join1 = Table.Join(Query_Latest, {"item"}, Query_DateRange, {"item"}, JoinKind.LeftOuter),
    // 合并上述结果和2023-03-01之前的记录
    Join2 = Table.Join(Join1, {"item"}, Query_Before20230301, {"item"}, JoinKind.LeftOuter)
in
    Join2

替代方案:嵌套连接的修正写法

如果坚持使用嵌套连接,需确保子查询的每个Item只有一条记录,展开时就不会引入多余数据:

let
    Source = Table.NestedJoin(Query_Latest, {"item"}, Query_DateRange, {"item"}, "DateRange_Records", JoinKind.LeftOuter),
    #"Expand DateRange" = Table.ExpandTableColumn(Source, "DateRange_Records", {"effect_date", "unit_price2"}, {"Range_effect_date", "Range_unit_price"}),
    #"Join with Before2023" = Table.NestedJoin(#"Expand DateRange", {"item"}, Query_Before20230301, {"item"}, "Before2023_Records", JoinKind.LeftOuter),
    #"Expand Before2023" = Table.ExpandTableColumn(#"Join with Before2023", "Before2023_Records", {"effect_date", "unit_price2"}, {"Before2023_effect_date", "Before2023_unit_price"})
in
    #"Expand Before2023"

验证要点
  1. 每个子查询运行后,确认每个Item只有一条符合条件的记录,无重复Item行
  2. 合并后检查每个Item对应的各日期列是否符合预期,未出现未过滤的旧数据

内容的提问来源于stack exchange,提问作者Adam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 19:17:15