求Power BI中按状态优先级赋值的DAX计算列
实现Power BI按状态优先级为重复引用分配最高状态的DAX计算列
问题场景
现有Power BI数据表包含两列:
- Column A:存在重复的引用值(如示例中的人名)
- Column B:状态值为
G1、G2、G3、G4、G5,同一引用可能对应多个状态
需要创建DAX计算列,按照G5 > G4 > G3 > G2 > G1的优先级,为每个引用的所有行分配其对应的最高优先级状态,示例如下:
原始数据:
| Column A | Column B |
|---|---|
| Rahul | G1 |
| Rahul | G2 |
| Rahul | G3 |
| Mehul | G1 |
| Mehul | G5 |
| Rohit | G1 |
| Ranjeet | G2 |
| Ranjeet | G5 |
期望结果:
| Column A | Column B | Result |
|---|---|---|
| Rahul | G1 | G3 |
| Rahul | G2 | G3 |
| Rahul | G3 | G3 |
| Mehul | G1 | G5 |
| Mehul | G5 | G5 |
| Rohit | G1 | G1 |
| Ranjeet | G2 | G5 |
| Ranjeet | G5 | G5 |
解决方案:DAX计算列公式
通用版(适配任意状态命名)
通过将状态转换为可比较的优先级数值,再提取最大值对应的状态:
Result = VAR CurrentRef = '表名'[Column A] VAR StatusPriority = SWITCH( TRUE(), '表名'[Column B] = "G5", 5, '表名'[Column B] = "G4", 4, '表名'[Column B] = "G3", 3, '表名'[Column B] = "G2", 2, '表名'[Column B] = "G1", 1 ) VAR MaxPriority = CALCULATE( MAXX('表名', StatusPriority), ALLEXCEPT('表名', '表名'[Column A]) ) RETURN SWITCH( MaxPriority, 5, "G5", 4, "G4", 3, "G3", 2, "G2", 1, "G1" )
简化版(适配G+数字的状态命名)
如果状态固定为G加数字的格式,可以直接提取数字进行比较,省去两次SWITCH:
Result = VAR CurrentRef = '表名'[Column A] VAR MaxStatusNum = CALCULATE( MAXX('表名', VALUE(RIGHT('表名'[Column B], 1))), ALLEXCEPT('表名', '表名'[Column A]) ) RETURN "G" & MaxStatusNum
公式说明
- CurrentRef:获取当前行的引用值,用于筛选同一引用的所有行。
- StatusPriority/MaxStatusNum:将状态转换为可比较的数值,数值越大代表优先级越高。
- MaxPriority:用
ALLEXCEPT保留当前引用的所有行,再用MAXX提取其中的最高优先级数值。 - RETURN部分:将最高优先级数值转换回对应的状态文本。
内容的提问来源于stack exchange,提问作者Omar
相关产品推荐
相关产品推荐

