mysql-检查患者在完成预约后是否有其他预约,按天细分

5f0d552i  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(370)

我正试图确定病人的重新任命。我想得到一个预约列表,按病人和日期分组,他们当天的预约,以及在那一天之后的预约。如果他们在那一天之后有另一个约会,那就被认为是连任。
预约表如下:
apptid:主键
patientid:患者的id
scheduledate:约会发生的时间。
应用状态: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

数据、模式和我在这方面的尝试就在这把小提琴里。
实际结果(以该患者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

如何重写查询以获得上述结果?

q3aa0525

q3aa05251#

窗口函数在这里可以很好地工作,但它们仅在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

相关问题