DAX按日期排名报错:EARLIER/EARLIEST无对应行上下文
问题分析与解决方案
一、报错原因
EARLIER('tableName'[Disease])需要依赖外层行上下文才能生效,但如果你的公式是作为度量值使用,外层只有筛选上下文没有行上下文,EARLIER找不到可引用的更早行上下文,直接触发报错。就算是写计算列,当前写法也没必要用EARLIER——计算列本身每行自带行上下文,直接引用'tableName'[Disease]就能拿到当前行的疾病值。
二、修正排名公式(若仍需生成排名)
如果只是要实现按疾病分组对发布日期的密集升序排名,分两种场景处理:
1. 作为计算列
去掉EARLIER,直接用当前行上下文的疾病值筛选:
Rank_By_Disease = RANKX ( FILTER ( 'tableName', 'tableName'[Disease] = 'tableName'[Disease] ), 'tableName'[Released Date], , ASC, DENSE )
更简洁的写法可以用ALLEXCEPT保留当前疾病的筛选逻辑:
Rank_By_Disease = RANKX ( ALLEXCEPT('tableName', 'tableName'[Disease]), 'tableName'[Released Date], , ASC, DENSE )
2. 作为度量值
如果是度量值,需要先捕获当前筛选的疾病值,再传入RANKX:
Rank_By_Disease_Measure = VAR CurrentDisease = SELECTEDVALUE('tableName'[Disease]) RETURN RANKX ( FILTER ( ALL('tableName'), 'tableName'[Disease] = CurrentDisease ), 'tableName'[Released Date], , ASC, DENSE )
注:这种写法需要可视化组件中存在Disease的行/列上下文(比如表格的行字段包含疾病),否则SELECTEDVALUE会返回空。
三、针对核心需求的最优方案
你的最终目标是:用户选择任意药物后,查看该药物首个获批的疾病。没必要生成排名,直接获取该药物对应最小发布日期的疾病即可,效率更高:
度量值写法(推荐)
First_Approved_Disease = VAR MinReleaseDate = CALCULATE( MIN('tableName'[Released Date]), ALLSELECTED('tableName'[Drug]) ) RETURN CALCULATE( SELECTEDVALUE('tableName'[Disease]), 'tableName'[Released Date] = MinReleaseDate )
或者用TOPN直接取最早获批的记录:
First_Approved_Disease = VAR FirstApproval = TOPN(1, ALLSELECTED('tableName'), 'tableName'[Released Date], ASC) RETURN SELECTCOLUMNS(FirstApproval, "First Disease", 'tableName'[Disease])
补充说明
- 当用户选中某一药物时,
ALLSELECTED('tableName'[Drug])会保留当前药物的筛选条件,精准定位该药物的所有获批记录。 - 如果同一药物在同一天获批多个疾病,
SELECTEDVALUE会返回第一个匹配值;若需要展示所有疾病,可改用CONCATENATEX(FirstApproval, 'tableName'[Disease], ", ")合并结果。
内容的提问来源于stack exchange,提问作者cesalomx
相关产品推荐
相关产品推荐

