如何在DAX中过滤LOOKUPVALUE取符合条件的最后一行?
解决LOOKUPVALUE多匹配报错:获取最后一条匹配记录
当LOOKUPVALUE遇到多条匹配记录时会触发报错,因为它要求返回结果唯一。要获取每个CoilNo对应的最后一条记录(按日期或ID排序),可以用以下几种DAX方案:
方案1:按日期取最新记录
假设目标表有日期列(如RecordDate),先找到每个CoilNo对应的最大日期,再提取该日期下的UTol值:
Strand UTol = VAR CurrentLotNo = 'LEONI DEV$Lot Measurement'[Lot No_] VAR LatestDate = CALCULATE( MAX('CAQ_Wire T_USER_REALVALS - Strand'[RecordDate]), // 替换为实际日期列名 'CAQ_Wire T_USER_REALVALS - Strand'[CoilNo] = CurrentLotNo ) RETURN CALCULATE( VALUES('CAQ_Wire T_USER_REALVALS - Strand'[UTol]), 'CAQ_Wire T_USER_REALVALS - Strand'[CoilNo] = CurrentLotNo, 'CAQ_Wire T_USER_REALVALS - Strand'[RecordDate] = LatestDate )
方案2:按ID取最新记录
如果表中有自增ID列(如RecordID),最大ID对应最新记录,逻辑和日期方案一致:
Strand UTol = VAR CurrentLotNo = 'LEONI DEV$Lot Measurement'[Lot No_] VAR MaxRecordID = CALCULATE( MAX('CAQ_Wire T_USER_REALVALS - Strand'[RecordID]), // 替换为实际ID列名 'CAQ_Wire T_USER_REALVALS - Strand'[CoilNo] = CurrentLotNo ) RETURN CALCULATE( VALUES('CAQ_Wire T_USER_REALVALS - Strand'[UTol]), 'CAQ_Wire T_USER_REALVALS - Strand'[CoilNo] = CurrentLotNo, 'CAQ_Wire T_USER_REALVALS - Strand'[RecordID] = MaxRecordID )
方案3:用TOPN简化逻辑
TOPN可以直接筛选出排序后的第一条记录,代码更简洁:
Strand UTol = VAR CurrentLotNo = 'LEONI DEV$Lot Measurement'[Lot No_] VAR LatestRecord = TOPN( 1, FILTER('CAQ_Wire T_USER_REALVALS - Strand', 'CAQ_Wire T_USER_REALVALS - Strand'[CoilNo] = CurrentLotNo), 'CAQ_Wire T_USER_REALVALS - Strand'[RecordDate], DESC // 替换为日期/ID列,DESC表示降序取最新 ) RETURN MAXX(LatestRecord, 'CAQ_Wire T_USER_REALVALS - Strand'[UTol])
注意事项
- 务必将公式中的
RecordDate/RecordID替换为你表中实际的日期或ID列名 - 如果同一
CoilNo在最大日期/ID下仍有多条不同的UTol值,VALUES会返回错误,此时需要检查数据一致性,或添加额外筛选条件(如时间戳)确保唯一匹配
内容的提问来源于stack exchange,提问作者Eiten
相关产品推荐
相关产品推荐

