PowerBI中按唯一订单号将下一行秒值转为新列的方法
PowerBI 创建“下一行秒数”计算列方案
原始数据
| 订单号 | 秒数 |
|---|---|
| 10 | 51 |
| 10 | 100 |
| 10 | 2 |
| 10 | 0 |
| 20 | 12 |
| 20 | 722 |
| 20 | 3 |
| 30 | 200 |
| 40 | 98 |
| 40 | 0 |
| 50 | 5 |
| 50 | 200 |
| 50 | 200 |
目标效果
| 订单号 | 秒数 | 下一行秒数 |
|---|---|---|
| 10 | 51 | 100 |
| 10 | 100 | 2 |
| 10 | 2 | 0 |
| 10 | 0 | BLANK |
| 20 | 12 | 722 |
| 20 | 722 | 3 |
| 20 | 3 | BLANK |
| 30 | 200 | BLANK |
| 40 | 98 | 0 |
| 40 | 0 | BLANK |
| 50 | 5 | 200 |
| 50 | 200 | 200 |
| 50 | 200 | BLANK |
实现方法
方法1:使用OFFSET函数(推荐,PowerBI Desktop 2022.11+版本支持)
创建计算列时,输入以下DAX公式,替换你的表名为实际表名称:
下一行秒数 = CALCULATE( SELECTEDVALUE('你的表名'[秒数]), OFFSET(1, FILTER('你的表名', '你的表名'[订单号] = EARLIER('你的表名'[订单号])), ORDERBY('你的表名'[秒数], ASC) ) )
- 逻辑:按
订单号分组,取当前行之后第1行的秒数值,若当前是组内最后一行,自动返回BLANK。
方法2:兼容旧版本的RANKX写法
如果你的PowerBI版本不支持OFFSET,用以下公式:
下一行秒数 = VAR 当前行排名 = RANKX( FILTER('你的表名', '你的表名'[订单号] = EARLIER('你的表名'[订单号])), '你的表名'[秒数], , ASC, DENSE ) VAR 组内最大排名 = MAXX( FILTER('你的表名', '你的表名'[订单号] = EARLIER('你的表名'[订单号])), RANKX( FILTER('你的表名', '你的表名'[订单号] = EARLIER('你的表名'[订单号])), '你的表名'[秒数], , ASC, DENSE ) ) RETURN IF( 当前行排名 < 组内最大排名, MAXX( FILTER( '你的表名', '你的表名'[订单号] = EARLIER('你的表名'[订单号]) && RANKX( FILTER('你的表名', '你的表名'[订单号] = EARLIER('你的表名'[订单号])), '你的表名'[秒数], , ASC, DENSE ) = 当前行排名 + 1 ), '你的表名'[秒数] ), BLANK() )
- 逻辑:先给每个订单号下的行按
秒数升序排名,判断当前行是否为组内最后一行,若非最后一行,取排名+1对应的秒数,否则返回BLANK。
内容的提问来源于stack exchange,提问作者N_ote
相关产品推荐
相关产品推荐

