我正试图确定病人的重新任命。我想得到一个预约列表,按病人和日期分组,他们当天的预约,以及在那一天之后的预约。如果他们在那一天之后有另一个约会,那就被认为是连任。
预约表如下:
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
如何重写查询以获得上述结果?
1条答案
按热度按时间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
aLEFT JOIN
appointments
futureapptON futureappt.PatientID = a.PatientID and futureappt.ScheduleDate>a.ScheduleDate
WHERE
a.ApptStatus = 3
GROUP BY
a.PatientID
, a.ScheduleDate