我有以下数据库表和一些虚拟数据:
id | doctor_id | patient_id | date
1 | 1 | 1 | 2020-06-06
2 | 1 | 1 | 2020-10-06
3 | 1 | 2 | 2020-10-06
4 | 1 | 2 | 2020-23-06
5 | 1 | 2 | 2020-25-06
如果病人只有过去的预约,我会为他选择最后一个预约;如果他还有未来的预约,我会选择下一个预约。 在上面的示例中,查询应该返回ID为2和4的记录-患者1的最后一次约会,因为他只有过去的约会和患者2的第一次未来的约会,因为他也有未来的约会。
有人能帮我一个关于如何创建这些查询的线索吗。 谢谢
如果只需要doctor_id
,patient_id
和date
,则使用条件聚合:
select doctor_id, patient_id,
coalesce(
min(case when date > curdate() then date end),
max(case when date < curdate() then date end)
) date
from tablename
group by doctor_id, patient_id
如果要使用ID
的整行:
select t.* from tablename t
where (doctor_id, patient_id, date) = (
select doctor_id, patient_id,
coalesce(
min(case when date > curdate() then date end),
max(case when date < curdate() then date end)
) date
from tablename
where (doctor_id, patient_id) = (t.doctor_id, t.patient_id)
);
对于还包括当前日期的情况,您可以用<=
或>=
更改不等式符号<
和>
。
请参阅演示。
创建两个查询,
今天之前的最后一次拜访,
而另一个将在今天之后首次回访。
在此之后,您可以使用“if”(或大小写when
)将两者组合在一起
或者,你可以这样做:
select patient_id, max(d) `VISIT`
from (
select
patient_id,
case when `date`<'2020-06-20' then max(`date`) else min(`date`) end d,
case when `date`<'2020-06-20' then -1 else 1 end X
from visits
group by patient_id,x) y
group by patient_id
;
我忘记将“2020-06-20”更改为curdate()
.。。。 这是一个非常重要的问题