Как получить самую последнюю прошлую дату из текущей даты и самую будущую дату из текущей даты в sql

#sql #sql-server

#sql #sql-server

Вопрос:

Я работаю над небольшим приложением, которое записывает посещения пациентов на прием. У меня есть как Patient таблица, так и Appointment таблица.

В таблице встреч у меня есть следующие поля: AppointmentId , AppointmentDate , PatientId

В таблице пациентов у меня есть PatientId , PatientName

В Appointment таблице у меня есть записи следующим образом:

 1 | 2020-08-08 | 2
2 | 2020-10-11 | 2
3 | 2020-12-15 | 2
4 | 2020-12-24 | 2
 

Что я хочу получить, так это то, что для всех пациентов я извлекаю наборы данных из PatientId . Я хочу получить дату последней встречи, т.е. 2020-10-11 и Дату следующей встречи, т.е. 2020-12-15 Если я выполняю запрос сегодня.

Я пробовал следующее, но не получил желаемых результатов. Может кто-нибудь, пожалуйста, помочь мне с этим SQL-запросом?

 SELECT 
    patient.PatientName,
    MAX(appointment.AppointmentDate) AS NextVisit,
    MIN(appointment.AppointmentDate) AS LastVisit
FROM 
    Patient patient 
INNER JOIN 
    Appointment appointment ON patient.PatientId = appointment.PatientId
 

Комментарии:

1. Какую версию SQL вы используете (например, MySQL, SQL Server, Postgres и т. Д.)?

2. @TimBiegeleisen: SQL Server 2017

Ответ №1:

Вы можете использовать left joins в sql следующим образом:

 Select p.patientid, patientname,
       Max(ap.appointmentdate) as previous_appointment,
       Min(an.appointmentdate) as next _appointment
  from patient p
  Left join appointment ap on p.patientid = ap.patientid and ap.appointmentdate < sysdate
  Left join appointment an on p.patientid = an.patientid and an.appointmentdate > sysdate
Group by p.patientid, p.patientname
 

Вы также можете использовать conditional aggregation следующее:

 Select p.patientid, patientname,
           Max(case when ap.appointmentdate < sysdate then ap.appointmentdate end) as previous_appointment,
           Min(case when ap.appointmentdate > sysdate then ap.appointmentdate end) as next _appointment
  from patient p
       Left join appointment ap on p.patientid = ap.patientid
Group by p.patientid, p.patientname
 

Пожалуйста, используйте >= или <= вместо < и > в состоянии в соответствии с вашими требованиями.