Power BI中如何按组汇总每个人员的最新值?
按组取最新值再求和的DAX解决方案
这个问题我太熟悉了!你碰到的核心问题在于LASTDATE函数是在当前整个筛选上下文里返回单一的最新日期,而不是按Person分组后每组各自的最新日期。要实现「按每个人取最新成绩,再把这些成绩求和」的需求,用DAX可以通过两种常用方法解决:
方法一:先分组生成最新成绩表,再求和
这种方法逻辑清晰,先通过SUMMARIZE生成每个人员的最新成绩表,再对表中的成绩求和:
Sum_Latest_Grade = VAR Person_Latest_Grades = SUMMARIZE( '你的数据表', -- 替换成你实际的表名 '你的数据表'[Person], "Latest_Grade", CALCULATE( MAX('你的数据表'[Grade]), -- 若同一人同一天有多个成绩,这里可换AVERAGE/SUM等 FILTER( '你的数据表', '你的数据表'[Date] = MAX('你的数据表'[Date]) ) ) ) RETURN SUMX(Person_Latest_Grades, [Latest_Grade])
逻辑说明:
SUMMARIZE按Person分组,为每个人生成一行记录- 对每组,用
FILTER筛选出该人员的所有记录中日期等于自身最新日期的行,再用MAX取出对应成绩(如果同一天有多个成绩,你可以根据需求替换聚合函数) - 最后用
SUMX遍历这个分组表,把所有人的最新成绩加起来
方法二:直接遍历人员计算,代码更简洁
如果不想生成中间表,也可以用SUMX结合TOPN直接计算:
Sum_Latest_Grade = SUMX( VALUES('你的数据表'[Person]), -- 获取所有唯一的人员 MAXX( TOPN(1, FILTER('你的数据表', '你的数据表'[Person] = EARLIER('你的数据表'[Person])), '你的数据表'[Date], DESC), '你的数据表'[Grade] ) )
逻辑说明:
VALUES('你的数据表'[Person])得到所有不重复的人员列表SUMX遍历每个人员,对当前人员:- 用
FILTER筛选出该人员的所有记录 TOPN(1, ..., Date, DESC)取出其中日期最新的那一行MAXX取出这一行的Grade值
- 用
- 最后把所有人员的最新Grade相加
验证你的示例数据
代入你给出的表格:
- P1的最新日期是2022年2月,对应Grade=7
- P2的最新日期是2021年8月,对应Grade=9
两种方法计算后都会得到7+9=16,完全符合你的期望结果。
如果你的场景里还有其他筛选条件(比如你提到的radar类别),只需要把筛选条件加到DAX的筛选上下文里即可(比如在CALCULATE里添加'你的数据表'[类别] = "radar")。
内容的提问来源于stack exchange,提问作者Severino Netto




