Выберите прошлые записи, если нет будущих записей, в противном случае выберите первую будущую запись - PullRequest
1 голос
/ 20 июня 2020

У меня есть следующая таблица базы данных и некоторые фиктивные данные:

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  

Я хотел бы выбрать последнее посещение для пациента, если у него только прошлые встречи, или следующее посещение, если у него также есть будущие встречи .

В приведенном выше примере запрос должен возвращать запись с идентификаторами 2 и 4 - последнее посещение для пациента 1, потому что у него есть только прошлые встречи, и первое будущее назначение для пациента 2, потому что у него также есть будущее назначение.

Как я могу создавать эти запросы?

Ответы [ 2 ]

1 голос
/ 20 июня 2020

Если вам нужны только 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)
);

Вы можете заменить символы неравенства < и > на <= или >= для случая, который включает также текущую дату. См. Демонстрацию .

0 голосов
/ 20 июня 2020

Создайте два запроса,

один, который вернет последнее посещение до сегодняшнего дня,

, а другой, по которому вернет первое посещение после сегодняшнего дня.

после этого вы можно комбинировать оба, используя 'IF' (или CASE 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() .... ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...