Power BI如何按分组取末条记录值生成去重表或计算列
Power BI 实现合同去重保留最后一条报价拒因的方法
你要的需求不适合用计算列实现(计算列依附原表存在,无法直接生成独立的去重结果表),可以通过Power Query表转换(优先推荐)或者DAX新建计算表两种方式实现,具体操作如下:
方法一:Power Query 可视化操作(推荐,性能好易维护)
操作全程不需要写复杂代码,原数据刷新时结果会自动同步:
- 进入Power Query编辑器:点击顶部主页选项卡的「转换数据」按钮,打开编辑界面
- 补充行顺序标识:Power BI不会固定保存表的原始行顺序,必须先加一个字段作为判断“最后一条”的依据:
- 如果原表已经有报价提交时间、记录自增ID这类可以判断先后的字段,直接用现有字段即可
- 如果没有,点击顶部「添加列」选项卡>「索引列」>「从1开始」,生成从1逐行递增的序号,序号越大代表记录越靠后,对应你要的最后一条
- 按合同编号分组:选中
Contract列,点击「转换」选项卡>「分组依据」,在弹窗里选「高级」模式:- 第一个聚合项:新列名填
MaxOrder,操作选「最大值」,列选你刚才用来标识顺序的字段(索引/提交时间/自增ID都可以) - 点「添加聚合」加第二个项:新列名填
Detail,操作选「所有行」 - 点确认完成分组
- 第一个聚合项:新列名填
- 提取对应最后一条的拒因:
- 点
Detail列右上角的展开箭头,只勾选Reason和你用来排序的顺序字段,取消「使用原始列名作为前缀」的勾选,点确认 - 筛选行,只保留顺序字段值和
MaxOrder值相等的行 - 删除多余的
MaxOrder、顺序辅助列,把Contract列重命名为Contract(Distinct)
- 点
- 点击左上角「关闭并应用」,就能得到你要的结果表。
方法二:DAX 新建计算表
如果不想调整Power Query的转换逻辑,可以直接在报表视图写DAX生成计算表,把代码里的你的业务表名换成你实际的表名即可:
合同去重结果表 = VAR 加行序标记 = ADDCOLUMNS( '你的业务表名', "@行序", RANKX( FILTER('你的业务表名', '你的业务表名'[Contract] = EARLIER('你的业务表名'[Contract])), '你的业务表名'[Reason],,ASC,DENSE ) ) VAR 取最后一条 = SELECTCOLUMNS( FILTER(加行序标记, [@行序] = MAXX(FILTER(加行序标记, [Contract] = EARLIER([Contract])), [@行序])), "Contract(Distinct)", [Contract], "Reason", [Reason] ) RETURN 取最后一条
注意:如果有明确的时间/ID排序字段,把上面RANKX里用来排序的
[Reason]换成你的排序字段,结果会更准确,避免因为原表加载顺序变动导致结果出错。
内容的提问来源于stack exchange,提问作者Pedro Bouzan
相关产品推荐
相关产品推荐

