DAX度量中Age Group筛选未生效问题及修改后生效原因疑问
卡普兰-迈耶分析中DAX度量的筛选问题解决解析
我在做卡普兰-迈耶(Kaplan Meier)计算时,需要统计Length大于等于当前行Length的唯一患者数(按RequestNumber去重),为此创建了度量Total Patients m。
初始DAX代码(存在筛选失效问题)
Total Patients m = VAR CurrentLength = SELECTEDVALUE(KM[Length]) RETURN CALCULATE( DISTINCTCOUNT(SDP_Patients[RequestNumber]), FILTER( ALL(SDP_Patients), SDP_Patients[Length] >= CurrentLength ), ALLEXCEPT(SDP_Patients, SDP_Patients[Age Group]) )
问题描述
最初我把它设为计算列,后来改成动态度量,但发现Age Group的筛选始终无法作用于这个度量。其中KM表的Length是通过GENERATESERIES(0,MAX(SDP_Patients[Length]),1)生成的,代表起止日期的周差值。
修改后的DAX代码(问题解决)
Total Patients m = VAR CurrentLength = SELECTEDVALUE(KM[Length]) RETURN CALCULATE( DISTINCTCOUNT(SDP_Patients[RequestNumber]), SDP_Patients[Length] >= CurrentLength, ALLEXCEPT(SDP_Patients, SDP_Patients[Service]) )
问题原因解析
初始代码的问题根源
FILTER(ALL(SDP_Patients), ...)会清除SDP_Patients表的所有筛选上下文,包括外部的Age Group筛选条件。- 后续的
ALLEXCEPT(SDP_Patients, SDP_Patients[Age Group])试图保留Age Group的筛选,但由于ALL(SDP_Patients)已经清空了表的筛选状态,ALLEXCEPT此时仅能保留Age Group的筛选结构,无法继承外部的Age Group筛选上下文——外部筛选已被ALL完全清除,导致Age Group筛选无法生效。
修改后代码的生效逻辑
- 去掉
FILTER(ALL(...)),直接使用SDP_Patients[Length] >= CurrentLength作为筛选条件,这个筛选会在当前的筛选上下文中执行,不会清除外部已有的筛选规则。 ALLEXCEPT(SDP_Patients, SDP_Patients[Service])的作用是:清除SDP_Patients表中除Service之外的所有筛选,但会保留外部传入的Service筛选条件。此时Length >= CurrentLength的筛选会基于这个保留了Service筛选的上下文执行,外部的Service筛选也能正常作用于度量,最终实现了正确的筛选效果。
内容的提问来源于stack exchange,提问作者Fatima Arshad
相关产品推荐
相关产品推荐

