You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 22:50:26