Power BI中如何匹配两个表的最近3D点并获取对应属性
Power BI 3D空间点最近邻匹配最优方案
你之前的方案核心是通过坐标取整做等值匹配,精度受取整参数影响,属于近似匹配,无法保证拿到真正的最近邻点属性,以下是两种更优的实现方案:
方案1:DAX计算列方案(适合中小数据量,实时计算)
直接基于3D欧氏距离的平方做比较(不需要开平方,相对大小一致,可提升计算性能),直接匹配最近点:
匹配属性 = VAR CurrentX = '表1'[X] VAR CurrentY = '表1'[Y] VAR CurrentZ = '表1'[Z] // 计算当前点到所有表2点的最小距离平方 VAR MinDisSquare = MINX(ALL('表2'), (CurrentX - '表2'[X])^2 + (CurrentY - '表2'[Y])^2 + (CurrentZ - '表2'[Z])^2) // 提取最小距离对应点的属性 RETURN CALCULATE(SELECTEDVALUE('表2'[属性]), ALL('表2'), (CurrentX - '表2'[X])^2 + (CurrentY - '表2'[Y])^2 + (CurrentZ - '表2'[Z])^2 = MinDisSquare)
该方案适配两个表总数据量10万条以内的场景,完全无精度损失,不需要提前做坐标取整处理。如果存在多个点距离完全一致的情况,SELECTEDVALUE会返回空,可替换为FIRSTNONBLANK('表2'[属性],1)取第一个匹配值。
方案2:Power Query预处理方案(适合大数据量,加载时计算)
如果数据量较大,DAX实时计算性能不足,可以在数据加载阶段用M语言完成匹配,不占用报告运行时资源:
let // 缓存表2数据到内存,提升遍历效率 BufferedTable2 = Table.Buffer(表2), // 为表1添加匹配列 AddMatchCol = Table.AddColumn(表1, "匹配属性", (currentPoint) => let // 计算当前点到所有表2点的距离平方 AddDisCol = Table.AddColumn(BufferedTable2, "距离平方", (p) => Number.Power(currentPoint[X]-p[X],2) + Number.Power(currentPoint[Y]-p[Y],2) + Number.Power(currentPoint[Z]-p[Z],2)), // 按距离升序排序 SortByDis = Table.Sort(AddDisCol,{{"距离平方", Order.Ascending}}), // 取最近点的属性 MatchAttr = SortByDis{0}[属性] in MatchAttr ) in AddMatchCol
内容的提问来源于stack exchange,提问作者Fishza
相关产品推荐
相关产品推荐

