Power BI合并Column2值不一致的两表实现数据匹配方案
Power BI 跨表模糊匹配取数实现方案
从给出的示例看,匹配逻辑为:相同Column1分组下,优先匹配Column2文本相似度最高的记录,同组内无高相似度匹配的行,分配组内剩余未被占用的Column3日期值,源数据不可修改的前提下,以下两种方法均可实现需求:
方法1:Power Query 实现(推荐,刷新性能更优)
操作步骤:
- 导入两张表到Power BI后,点击「转换数据」进入Power Query编辑器
- 先给两张表的Column2做基础标准化,消除大小写、无关字符的匹配干扰:分别选中两张表的Column2,通过「格式」菜单统一转为小写,也可以按需添加移除标点、提取词干的步骤,进一步缩小文本差异
- 选中表2,添加自定义列,先完成高相似度行的匹配,以下M代码可直接复用,注意把代码里的
表1替换成你实际的表名:
= let CurrentGroupID = [Column1], CurrentCol2 = Text.Lower([Column2]), // 筛选同Column1分组下的表1数据作为匹配池 GroupPool = Table.SelectRows(表1, each [Column1] = CurrentGroupID), // 按分词后的Jaccard相似度计算匹配度 CalcMatchScore = Table.AddColumn(GroupPool, "匹配度", each let T1Words = Text.Split(Text.Lower([Column2]), " "), T2Words = Text.Split(CurrentCol2, " "), IntersectCnt = List.Count(List.Intersect({T1Words, T2Words})), UnionCnt = List.Count(List.Distinct(List.Union({T1Words, T2Words}))) in Divide(IntersectCnt, UnionCnt, 0) ), // 取匹配度最高的对应日期 TopMatchRes = try Table.Sort(CalcMatchScore,{{"匹配度", Order.Descending}}){0}[Column3] otherwise null in TopMatchRes
- 完成高相似度匹配后,对返回空值的行(比如示例中的
Base行),做兜底匹配:取同Column1分组下,表1中未被其他行匹配到的剩余Column3值填充即可 - 将新增列重命名为Column4,上载数据到模型就能得到目标结果
方法2:DAX 计算列实现(无需调整Power Query查询)
如果不想修改现有查询逻辑,可以直接在表2中新建计算列,以下DAX代码可直接复用:
Column4 = VAR CurRowID = '表2'[Column1] VAR CurRowText = LOWER('表2'[Column2]) // 筛选同分组的表1数据 VAR GroupedT1 = FILTER(ALL('表1'), '表1'[Column1] = CurRowID) // 计算每行和当前行的文本匹配度 VAR AddScore = ADDCOLUMNS( GroupedT1, "MatchScore", VAR T1Text = LOWER('表1'[Column2]) VAR T1WordList = SELECTCOLUMNS(ADDCOLUMNS(GENERATESERIES(1, PATHLENGTH(SUBSTITUTE(T1Text, " ", "|"))), "Word", PATHITEM(SUBSTITUTE(T1Text, " ", "|"), [Value])), "Word", [Word]) VAR T2WordList = SELECTCOLUMNS(ADDCOLUMNS(GENERATESERIES(1, PATHLENGTH(SUBSTITUTE(CurRowText, " ", "|"))), "Word", PATHITEM(SUBSTITUTE(CurRowText, " ", "|"), [Value])), "Word", [Word]) VAR IntersectCnt = COUNTROWS(INTERSECT(T1WordList, T2WordList)) VAR UnionCnt = COUNTROWS(DISTINCT(UNION(T1WordList, T2WordList))) RETURN DIVIDE(IntersectCnt, UnionCnt, 0) ) // 取匹配度最高的日期,匹配度为0时兜底取同组剩余日期 VAR TopMatch = MAXX(TOPN(1, AddScore, [MatchScore], DESC), '表1'[Column3]) RETURN IF(ISBLANK(TopMatch), MAXX(EXCEPT(GroupedT1, DISTINCT('表2'[Column4])), '表1'[Column3]), TopMatch)
- 该计算列会自动完成分组内的相似度匹配和空值兜底,和示例输出结果完全一致
- 如果后续Column2的文本差异变大,可以调整相似度计算规则,比如添加模糊匹配阈值、关键词权重,进一步提升匹配准确率
注意:如果数据量超过10万行,优先选择Power Query方案,DAX计算列在大数据量下的刷新速度会明显慢于Power Query的预处理结果。
内容的提问来源于stack exchange,提问作者Ankesh Kumar
相关产品推荐
相关产品推荐

