我正在尝试确定患者的重新任命。我想得到一份按病人和日期分组的约会清单,当天他们有任何约会,以及他们在那一天之后可能有的约会。如果他们在那天之后确实有另一个约会,那么这被认为是重新任命。
约会表如下:
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
如何重写查询以实现上述结果?
答案 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