如何构建按用户取首个非空值求和的DAX度量
按用户取首个非空值求和的DAX度量解决方案
嘿,我来帮你搞定这个DAX度量的问题!你的需求是按用户分组,取每个用户最早日期对应的非空value然后求和,对吧?你提到用FIRSTNONBLANK的思路是对的,但确实需要结合分组和排序逻辑才能准确拿到“首个”(最早日期)的非空值,我给你两种可行的写法:
写法一:用ADDCOLUMNS + SUMX
这个写法逻辑清晰,先获取所有唯一用户,再逐个计算每个用户的首个非空值,最后求和:
SumFirstNonBlankPerUser = VAR UserFirstNonBlank = ADDCOLUMNS( -- 获取所有不重复的用户 VALUES(myTable[user]), -- 给每个用户添加首个非空值的计算列 "@FirstValue", CALCULATE( FIRSTNONBLANK(myTable[value], 1), -- 按日期升序取该用户最早的非空值记录 TOPN(1, FILTER(myTable, NOT ISBLANK(myTable[value])), myTable[date], ASC) ) ) RETURN -- 遍历所有用户的首个非空值并求和 SUMX(UserFirstNonBlank, [@FirstValue])
写法二:用GROUPBY实现分组计算
如果你更倾向于用GROUPBY来实现分组,这个版本也能达到目的:
SumFirstNonBlankPerUser_GRP = SUMX( GROUPBY( myTable, -- 按用户分组 myTable[user], -- 定义组内计算:获取该用户最早的非空值 "@FirstValue", VAR UserNonBlankRows = FILTER(CURRENTGROUP(), NOT ISBLANK([value])) VAR EarliestNonBlankRow = TOPN(1, UserNonBlankRows, myTable[date], ASC) RETURN MAXX(EarliestNonBlankRow, [value]) ), -- 对每个组的计算结果求和 [@FirstValue] )
关键逻辑说明
- 核心是按日期排序取最早的非空记录:
FIRSTNONBLANK本身只是返回列中的第一个非空值,但如果不指定排序,它的结果可能不符合“首个(按时间)”的需求,所以必须用TOPN(1, ..., myTable[date], ASC)来锁定最早日期的那条非空数据。 - 两种写法都会得到你期望的结果:用户a的首个非空值15 + 用户b的首个非空值3 = 18。
内容的提问来源于stack exchange,提问作者Neil P
相关产品推荐
相关产品推荐

