Power BI中如何通过Table 1与Table 2生成Table 3?
Power BI高效生成Table3的方案(替代低效的Text.Contains)
表结构说明(基于截图整理)
- Table1:字段为
物料编码、物料名称,是待分类的物料清单 - Table2:字段为
物料组名称、包含物料关键词(关键词以逗号分隔),是物料组的规则映射表 - Table3:目标表,为Table1的每条物料匹配对应的
物料组名称
优化匹配方案
方案1:Power Query拆分关键词+合并查询(低耗时易操作)
- 进入Power Query编辑器,加载Table2
- 拆分
包含物料关键词列:选中该列 → 点击「拆分列」→ 按逗号分隔符拆分到行,得到「物料组名称」对应单个关键词的行数据 - 合并Table1与拆分后的Table2:
- 选中Table1 → 点击「合并查询」→ 选择拆分后的Table2作为关联表
- 匹配条件设置为:Table1的
物料名称包含 Table2的包含物料关键词
- 展开合并后的
物料组名称列,按需去重(若单个物料匹配多组,可按业务规则保留首个结果或全部结果)
方案2:Power Query哈希表预处理(极致高效)
- 先处理Table2,生成关键词-物料组的哈希表:
let 源 = Table2, 添加关键词列表 = Table.AddColumn(源, "关键词列表", each Text.Split([包含物料关键词], ",")), 转哈希表 = Record.FromList(添加关键词列表[物料组名称], 添加关键词列表[关键词列表]) in 转哈希表 - 在Table1中添加匹配列:
哈希表的快速查找特性会大幅减少遍历次数,比原生Text.Contains快数倍。Table.AddColumn(Table1, "物料组名称", each let 物料名 = [物料名称], 匹配关键词 = List.Select(Record.FieldNames(转哈希表), (k) => Text.Contains(物料名, k)) in if List.Count(匹配关键词) > 0 then 转哈希表{匹配关键词{0}} else null )
方案3:DAX计算列(适合数据模型端生成)
若需在数据模型中直接生成Table3,用DAX的MAXX+SEARCH组合替代低效遍历:
物料组名称 = VAR 当前物料名 = 'Table1'[物料名称] RETURN MAXX( FILTER( 'Table2', SEARCH('Table2'[包含物料关键词], 当前物料名, 1, 0) > 0 ), 'Table2'[物料组名称] )
若需匹配多个物料组,可替换MAXX为CONCATENATEX拼接所有匹配结果。
原方法慢的核心原因
Text.Contains默认会生成两张表的笛卡尔积(计算量为Table1行数 × Table2行数),数据量较大时计算复杂度呈指数级增长。上述方案通过拆分关键词、哈希表预处理,将计算复杂度从O(n*m)降低到O(n+k)(k为关键词总数),效率显著提升。
内容的提问来源于stack exchange,提问作者JasonQ
相关产品推荐
相关产品推荐

