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"
验证要点
- 每个子查询运行后,确认每个
Item只有一条符合条件的记录,无重复Item行 - 合并后检查每个
Item对应的各日期列是否符合预期,未出现未过滤的旧数据
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

