Power BI DAX需求:按工号和日期获取最后非空班次及偏移值
解决Power BI中工号最近及上一日期非空班次的DAX方案
假设你的数据集名为WorkerShifts,包含Worker ID(工号)、日期、班次三列,以下是实现需求的DAX表达式:
1. 最近日期的最后非空班次(度量值)
最近日期最后班次 = VAR CurrentWorker = SELECTEDVALUE(WorkerShifts[Worker ID]) -- 筛选当前工号所有存在非空班次的日期 VAR WorkerDates = CALCULATETABLE( VALUES(WorkerShifts[日期]), WorkerShifts[Worker ID] = CurrentWorker, NOT(ISBLANK(WorkerShifts[班次])) ) -- 获取该工号的最近有效日期 VAR LatestDate = MAXX(WorkerDates, WorkerShifts[日期]) -- 提取最近日期下的最后一个非空班次 VAR LatestShift = CALCULATE( LASTNONBLANK(WorkerShifts[班次], 1), WorkerShifts[Worker ID] = CurrentWorker, WorkerShifts[日期] = LatestDate ) RETURN LatestShift
2. 上一存在日期的最后非空班次偏移值(度量值)
这里假设班次为数值型,偏移值定义为「最近班次 - 上一日期班次」:
上一日期班次偏移值 = VAR CurrentWorker = SELECTEDVALUE(WorkerShifts[Worker ID]) -- 收集当前工号所有带非空班次的日期及对应最后班次 VAR WorkerDatesSorted = CALCULATETABLE( ADDCOLUMNS( VALUES(WorkerShifts[日期]), "@Shift", CALCULATE(LASTNONBLANK(WorkerShifts[班次], 1)) ), WorkerShifts[Worker ID] = CurrentWorker, NOT(ISBLANK(WorkerShifts[班次])) ) -- 按日期倒序给有效日期排名 VAR RankedDates = ADDCOLUMNS( WorkerDatesSorted, "@Rank", RANKX(WorkerDatesSorted, [日期], , DESC) ) -- 取最近日期的班次(排名1) VAR LatestShift = MAXX(FILTER(RankedDates, [@Rank] = 1), [@Shift]) -- 取上一日期的班次(排名2) VAR PreviousShift = MAXX(FILTER(RankedDates, [@Rank] = 2), [@Shift]) -- 计算偏移值,无有效上一班次则返回空 RETURN IF(NOT(ISBLANK(PreviousShift)), LatestShift - PreviousShift, BLANK())
注意事项
- 确认
日期列设置为日期/时间类型,避免排序错误 - 若
班次是文本格式,需先用VALUE(WorkerShifts[班次])转换为数值后再计算偏移值 - 若同一天有多条班次记录,
LASTNONBLANK会取该日期内最后一条非空班次值 - 若工号仅有一条有效班次记录,偏移值会返回空值
内容的提问来源于stack exchange,提问作者Ventura
相关产品推荐
相关产品推荐

