基于分组最大值在PowerBI中查找对应值的DAX实现问题
PowerBI DAX实现分组最大值对应值(匹配SQL窗口函数逻辑)
问题背景
有深厚SQL背景,刚接触DAX,需实现类似SQL中CASE WHEN MAX(column) OVER (PARTITION BY group) = column2 THEN column3 ELSE "" END的逻辑:在PowerBI中基于分组内的ID最大值,仅在对应行显示该分组的Amount值,其余行留空,同时保证目标列总计为分组最大值的汇总。
原始数据
ID GroupID Amount 1 2 8502 2 2 8502 3 2 8502 4 2 8502 1 6 80 2 6 80
期望结果
ID GroupID Amount LatestGroupAmount 1 2 8502 2 2 8502 3 2 8502 4 2 8502 8502 1 6 80 2 6 80 80
要求:LatestGroupAmount列总计为8582(8502+80)
已尝试方法及问题
- 创建了两个度量值:
MaxID = MAX(data[ID]) MaxIDbyGroup = CALCULATE([MaxID], ALLEXCEPT(data, data[GroupID])) - 尝试用
LOOKUPVALUE(data[Amount], data[GroupId], data[MaxIDbyGroup])未得到正确结果 - 用CALCULATE实现时,出现数据行被过滤的问题,仅添加MaxID列后才显示全部行,但不需要该列
解决方案
方案1:计算列+度量值组合实现
- 添加计算列标记最大ID行
先创建计算列,标记当前行是否为对应GroupID下的最大ID行:
IsMaxIDInGroup = IF(data[ID] = CALCULATE(MAX(data[ID]), ALLEXCEPT(data, data[GroupID])), TRUE(), FALSE())
- 创建目标度量值
通过度量值控制显示逻辑,同时保证总计正确:
LatestGroupAmount = VAR CurrentIsMax = SELECTEDVALUE(data[IsMaxIDInGroup]) VAR GroupAmount = CALCULATE(MAX(data[Amount]), ALLEXCEPT(data, data[GroupID])) RETURN IF(CurrentIsMax = TRUE(), GroupAmount, BLANK())
方案2:纯度量值实现(无需额外计算列)
直接在度量值内完成判断逻辑,不需要新增计算列:
LatestGroupAmount = VAR CurrentID = SELECTEDVALUE(data[ID]) VAR MaxIDInGroup = CALCULATE(MAX(data[ID]), ALLEXCEPT(data, data[GroupID])) VAR GroupAmount = CALCULATE(MAX(data[Amount]), ALLEXCEPT(data, data[GroupID])) RETURN IF(CurrentID = MaxIDInGroup, GroupAmount, BLANK())
效果说明
- 仅分组内ID最大的行显示对应Amount,其余行留空
- 总计自动汇总所有分组的最大Amount值,符合8582的要求
内容的提问来源于stack exchange,提问作者Udar
相关产品推荐
相关产品推荐

