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
相关产品推荐
相关产品推荐

