You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何构建按用户取首个非空值求和的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:22:22