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

Я работаю над небольшим приложением, которое записывает визиты пациентов на прием. У меня есть и стол 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

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

Tim Biegeleisen 12.12.2020 07:14

@TimBiegeleisen: SQL Server 2017

Baadshah 12.12.2020 07:18
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
2
227
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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

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

Другие вопросы по теме