MySQL - 检查患者在完成预约后是不是有另一个预约,按天细分

Posted

技术标签:

【中文标题】MySQL - 检查患者在完成预约后是不是有另一个预约,按天细分【英文标题】:MySQL - Checking to see if a patient has had another appointment booked after a completed appointment, broken down by dayMySQL - 检查患者在完成预约后是否有另一个预约,按天细分 【发布时间】:2018-06-01 21:02:09 【问题描述】:

我正在尝试确定是否需要重新预约患者。我想获得一份按患者和日期分组的约会列表,包括他们当天的任何约会,以及他们在那一天之后可能进行的约会。如果他们在那一天之后确实有另一个约会,那将被视为重新约会。

预约表如下:

ApptID:主键

PatientID:患者的 ID

ScheduleDate:约会发生的时间。

ApptStatus:3 表示完成,4 表示已安排。这可能是无关紧要的,因为我想搜索在另一个已完成的约会之后发生的一个已完成的约会以及任何已安排的约会,但为了清楚起见,我将其保留在此处。

这是我目前的查询:

SELECT
    a.PatientID,
    a.ScheduleDate AS CompletedAppointment,
    MIN(futureappt.ScheduleDate) AS NextAppointment,
    CASE
        WHEN MIN(futureappt.ScheduleDate) IS NULL THEN 0
        ELSE 1
    END AS CountPatsReappointed,
    1 AS CountPatsSeen
FROM
    `appointments` a
    LEFT JOIN
        (
            SELECT
                fa.PatientID
              , fa.ScheduleDate AS ScheduleDate
            FROM
                `appointments` fa
            WHERE
                fa.ScheduleDate > NOW()
            GROUP BY
                fa.PatientID
              , fa.ScheduleDate
        )
        futureappt
        ON
            futureappt.PatientID = a.PatientID
WHERE
    a.ApptStatus                      = 3
GROUP BY
    a.PatientID
  , a.ScheduleDate
  , futureappt.ScheduleDate 

数据、架构和我对此的尝试是in this fiddle。

实际结果(以该患者 ID 为例)

ApptID  PatID   CompletedApp           Next   Reapp    PatSeen
269584    3144    2018-05-25T10:30:00Z    (null)    0    1
269826    3144    2018-05-29T14:45:00Z    (null)    0    1 

预期结果。注意下一个约会是如何出现的,因此算作重新约会:

ApptID  PatID   CompletedApp           Next   Reapp    PatSeen
269584    3144    2018-05-25T10:30:00Z    2018-05-29T14:45:00Z    1    1
269826    3144    2018-05-29T14:45:00Z    (null)    0    1 

如何重写查询以达到上述结果?

【问题讨论】:

很高兴您提供了一个小提琴,但我们能否更关注“MCVE”的“M”? 您与 ScheduleDate > NOW() 进行比较。为什么你会期望过去的日期会出现? 由于我不明白你到底想要达到什么目的,我无法正确回答。但是我认为这可能会帮助您朝着正确的方向前进:sqlfiddle.com/#!9/e8fc0b/8/0(很棒的东西,小提琴,我们可以摆弄;)) ScheduleDate > NOW() 的目标是返回今天之后的任何未来约会。但是,我想要实现的是列出患者预约的列和列出他们当天之后的下一次预约的另一列。希望这能澄清一点! 【参考方案1】:

窗口函数在这里可以很好地工作,但它们仅在 mysql v8.0 中受支持。

请查看下面的查询SQLfiddle。 注意加入fa.ScheduleDate > a.ScheduleDate 上的第二个约会表 而且你不需要按fa.ScheduleDate分组

SELECT
    a.PatientID,
    a.ScheduleDate AS CompletedAppointment,
    MIN(futureappt.ScheduleDate) AS NextAppointment,
    CASE
        WHEN MIN(futureappt.ScheduleDate) IS NULL THEN 0
        ELSE 1
    END AS CountPatsReappointed,
    1 AS CountPatsSeen
FROM `appointments` a
LEFT JOIN `appointments` futureappt
    ON futureappt.PatientID = a.PatientID and futureappt.ScheduleDate>a.ScheduleDate
WHERE
    a.ApptStatus                      = 3
GROUP BY
    a.PatientID
  , a.ScheduleDate

【讨论】:

以上是关于MySQL - 检查患者在完成预约后是不是有另一个预约,按天细分的主要内容,如果未能解决你的问题,请参考以下文章

根据表中的实例数限制数据输入

优化 SQL 查询以从大量 MySQL 数据库中获取数据

Java项目:医院预约挂号系统(java+Springboot+jsp+maven+layui+mysql)

团队合作

互联网医院公开报价

云杏分级转诊系统,提升患源利器