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

基于同表关联记录修正预约状态的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 12:35:22