PowerBI中相同名称行是否可仅基于上一行计算差值?
PowerBI 同name分组跨行差值计算实现方案
有两种常用的可落地实现方案:
方案1:DAX计算列实现(适合数据建模后直接计算)
该方案不需要修改原始数据源,直接在数据模型层新增字段即可:
- 提前确认你的表存在唯一且稳定的排序依据字段(通常为日期字段,示例中假设字段名为
date) - 新建计算列,替换代码中对应表名、字段名后即可使用:
diff previous day = VAR current_name = '你的表名'[name] VAR current_date = '你的表名'[date] // 取同name下当前日期之前最近一天的day earn值 VAR prev_earn = CALCULATE( MAX('你的表名'[day earn]), FILTER( ALL('你的表名'), '你的表名'[name] = current_name && '你的表名'[date] < current_date ), LASTDATE('你的表名'[date]) ) RETURN // 同name第一行/跨行name不一致时直接返回当前值,否则算差值 IF( ISBLANK(prev_earn), '你的表名'[day earn], '你的表名'[day earn] - prev_earn )
方案2:Power Query(M语言)实现(适合数据清洗阶段处理)
该方案在数据导入阶段完成计算,结果更稳定,适合不会写DAX的用户:
- 进入Power Query编辑器,选中对应数据表
- 先按
name升序、date升序完成排序(排序是前提,否则无法取到正确的上一行值) - 选中
name字段,执行「分组依据」操作,聚合方式选择「所有行」,生成分组后的Table列 - 新增自定义列,对每个分组内的子表单独计算差值,参考代码如下:
= Table.AddColumn([分组生成的Table列名], "计算差值表", each let // 给子表加索引用于定位上一行 add_index = Table.AddIndexColumn(_, "行索引", 0, 1, Int64.Type), // 取上一行的day earn值,第一行取当前值 add_prev = Table.AddColumn(add_index, "上一行收益", each try add_index[day earn]{[行索引]-1} otherwise [day earn]), // 按规则计算差值 add_diff = Table.AddColumn(add_prev, "diff previous day", each if [行索引] = 0 then [day earn] else [day earn] - [上一行收益]) in add_diff )
- 展开「计算差值表」列,删除多余的索引、上一行收益字段即可导出结果。
注意:两种方案都不可依赖PowerBI默认的行顺序,默认顺序没有稳定性保障,必须显式指定排序字段才能得到正确结果。
内容的提问来源于stack exchange,提问作者Taul
相关产品推荐
相关产品推荐

