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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 08:39:29