【发布时间】: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() 的目标是返回今天之后的任何未来约会。但是,我想要实现的是列出患者预约的列和列出他们当天之后的下一次预约的另一列。希望这能澄清一点!