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

DAX计算临床试验激活天数平均值度量返回空值的问题

DAX度量返回空值排查:符合条件的试验激活平均天数计算问题

问题核心原因

你的度量返回空值的关键问题在于FILTER行上下文与度量上下文的冲突:

在原度量的FILTER('Trial Data', ...)迭代过程中,每遍历一行时调用[TTA Outlier Lower Bound]和[TTA Outlier Upper Bound]这两个度量,此时度量会自动适配当前行的筛选上下文(即仅包含当前行的数据集)。在单一数据行的上下文下:

  • GEOMEAN会直接返回当前行的Time to Activation (Days)值
  • STDEV.P会返回0(单值数据集无标准差)

最终计算出的上下边界等于当前行的激活天数,而你的条件是Time to Activation (Days) > 下界且Time to Activation (Days) < 上界——这意味着当前行的值永远无法满足(既不大于自身也不小于自身),所有行都被过滤排除,因此AVERAGE函数没有可计算的数据,返回空值。

修复方案

方案1:使用变量预计算全局/目标数据集的边界值

将边界值的计算从行上下文中剥离,提前在全局或目标筛选上下文下计算完成,再用于筛选:

Average TTA (Days) = 
-- 预计算基于全表的异常值边界(若需基于Active数据集,可修改CALCULATE的筛选条件)
VAR GlobalTTA_Geomean = CALCULATE(GEOMEAN('Trial Data'[Time to Activation (Days)]), ALL('Trial Data'))
VAR GlobalTTA_STD = CALCULATE(STDEV.P('Trial Data'[Time to Activation (Days)]), ALL('Trial Data'))
VAR LowerBound = GlobalTTA_Geomean - 2 * GlobalTTA_STD
VAR UpperBound = GlobalTTA_Geomean + 2 * GlobalTTA_STD
RETURN
CALCULATE(
    AVERAGE('Trial Data'[Time to Activation (Days)]),
    'Trial Data'[Management Status] = "Active",
    'Trial Data'[Time to Activation (Days)] >= 0,
    'Trial Data'[Time to Activation (Days)] > LowerBound,
    'Trial Data'[Time to Activation (Days)] < UpperBound
)

方案2:修正辅助度量的上下文,简化主度量

如果希望保留原有的辅助度量,需修改它们的上下文为全局(或目标数据集),避免受行上下文影响:

-- 修正后的辅助度量:基于全表计算
TTA Geometric Mean = CALCULATE(GEOMEAN('Trial Data'[Time to Activation (Days)]), ALL('Trial Data'))
TTA Standard Deviation = CALCULATE(STDEV.P('Trial Data'[Time to Activation (Days)]), ALL('Trial Data'))

然后简化主度量,去掉冗余的FILTER,直接在CALCULATE中添加边界筛选:

Average TTA (Days) = 
VAR LowerBound = [TTA Geometric Mean] - 2 * [TTA Standard Deviation]
VAR UpperBound = [TTA Geometric Mean] + 2 * [TTA Standard Deviation]
RETURN
CALCULATE(
    AVERAGE('Trial Data'[Time to Activation (Days)]),
    'Trial Data'[Management Status] = "Active",
    'Trial Data'[Time to Activation (Days)] >= 0,
    'Trial Data'[Time to Activation (Days)] > LowerBound,
    'Trial Data'[Time to Activation (Days)] < UpperBound
)

方案3:基于Active数据集计算边界(若业务需求如此)

如果异常值边界需要基于Management Status = Active且Time to Activation (Days) >=0的数据集计算,而非全表,可使用CALCULATETABLE定义目标数据集后计算:

Average TTA (Days) = 
-- 先定义符合基础条件的数据集
VAR FilteredTrialData = CALCULATETABLE(
    'Trial Data',
    'Trial Data'[Management Status] = "Active",
    'Trial Data'[Time to Activation (Days)] >= 0
)
-- 基于筛选后的数据集计算边界
VAR TTA_Geomean = GEOMEANX(FilteredTrialData, 'Trial Data'[Time to Activation (Days)])
VAR TTA_STD = STDEV.PX(FilteredTrialData, 'Trial Data'[Time to Activation (Days)])
VAR LowerBound = TTA_Geomean - 2 * TTA_STD
VAR UpperBound = TTA_Geomean + 2 * TTA_STD
RETURN
CALCULATE(
    AVERAGE('Trial Data'[Time to Activation (Days)]),
    FilteredTrialData,
    'Trial Data'[Time to Activation (Days)] > LowerBound,
    'Trial Data'[Time to Activation (Days)] < UpperBound
)

内容的提问来源于stack exchange,提问作者jshaub

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 04:57:34