MySQL - 检查患者是否在完成约会后预约了另一个约会,按日

时间:2018-06-01 21:02:09

标签: mysql sql join left-join

我正在尝试确定患者的重新任命。我想得到一份按病人和日期分组的约会清单,当天他们有任何约会,以及他们在那一天之后可能有的约会。如果他们在那天之后确实有另一个约会,那么这被认为是重新任命。

约会表如下:

ApptID:主键

PatientID:患者的身份

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 

如何重写查询以实现上述结果?

1 个答案:

答案 0 :(得分: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