提问者:小点点

如果没有未来记录,则选择过去记录,否则选择第一个未来记录


我有以下数据库表和一些虚拟数据:

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的第一次未来的约会,因为他也有未来的约会。

有人能帮我一个关于如何创建这些查询的线索吗。 谢谢


共2个答案

匿名用户

如果只需要doctor_idpatient_iddate,则使用条件聚合:

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().。。。 这是一个非常重要的问题