基于同表关联记录修正预约状态的DAX/Power Query解决方案
多医生预约系统状态修正解决方案
DAX 计算列方案
针对Power BI存储优化导致的日期时间精度问题,通过截断时间保留日期部分规避异常,同时实现双条件判断:
实际完成状态 = VAR CurrentPatient = '预约表'[患者ID] VAR CurrentDoctor = '预约表'[医生ID] VAR CurrentDate = TRUNC('预约表'[预约日期时间]) // 截断时间,仅保留日期维度 VAR CurrentTime = '预约表'[预约日期时间] VAR TargetStatuses = {"Completed", "In Consult", "Waiting"} // 条件1:当前系统状态属于已完成类状态 VAR Condition1 = CONTAINSSTRINGEXACT(JOIN(TargetStatuses, "|"), '预约表'[系统状态]) // 条件2:当前状态为Called Upon,且同日同医生存在后续的已完成类状态预约 VAR Condition2 = '预约表'[系统状态] = "Called Upon" && CALCULATE( COUNTROWS('预约表'), '预约表'[患者ID] = CurrentPatient, '预约表'[医生ID] = CurrentDoctor, TRUNC('预约表'[预约日期时间]) = CurrentDate, '预约表'[预约日期时间] > CurrentTime, CONTAINSSTRINGEXACT(JOIN(TargetStatuses, "|"), '预约表'[系统状态]) ) > 0 RETURN IF(Condition1 || Condition2, "YES", "NO")
关键说明
- 使用
TRUNC函数处理日期时间,消除存储优化带来的精度误差,确保同日判断准确 - 通过
CONTAINSSTRINGEXACT结合JOIN统一判断状态是否属于目标集合,简化逻辑 - 用
CALCULATE筛选同日同医生的后续预约,计数大于0则满足条件2
Power Query 解决方案
通过排序缓冲+逐行判断实现,避免DAX的日期精度问题,同时提升计算稳定性:
let 源 = <你的数据源>, // 提取预约日期,用于同日判断 添加日期列 = Table.AddColumn(源, "预约日期", each Date.From([预约日期时间])), // 按患者ID、医生ID、预约日期、预约时间排序,确保后续筛选逻辑正确 排序数据 = Table.Sort(添加日期列,{{"患者ID", Order.Ascending}, {"医生ID", Order.Ascending}, {"预约日期", Order.Ascending}, {"预约日期时间", Order.Ascending}}), // 缓冲排序后的表,避免重复计算,提升性能 缓冲表 = Table.Buffer(排序数据), // 添加实际完成状态计算列 添加状态列 = Table.AddColumn(缓冲表, "实际完成状态", (当前行) => let TargetStatuses = {"Completed", "In Consult", "Waiting"}, // 筛选同日同医生且时间晚于当前行的所有记录 后续预约记录 = Table.SelectRows(缓冲表, each [患者ID] = 当前行[患者ID] and [医生ID] = 当前行[医生ID] and [预约日期] = 当前行[预约日期] and [预约日期时间] > 当前行[预约日期时间]), // 判断条件1:当前状态属于已完成类 条件1 = List.Contains(TargetStatuses, 当前行[系统状态]), // 判断条件2:当前状态为Called Upon,且后续存在已完成类状态的预约 条件2 = 当前行[系统状态] = "Called Upon" and List.AnyTrue(List.Transform(后续预约记录[系统状态], (s) => List.Contains(TargetStatuses, s))) in if 条件1 or 条件2 then "YES" else "NO" ) in 添加状态列
关键说明
- 先排序再缓冲,确保后续筛选的后续记录逻辑准确,同时减少重复计算
- 用
Date.From提取日期,避免日期时间精度问题 - 通过
List.AnyTrue判断后续记录中是否存在符合条件的状态,逻辑直观
内容的提问来源于stack exchange,提问作者Javier Lopez
相关产品推荐
相关产品推荐

