Я работаю над небольшим приложением, которое записывает визиты пациентов на прием. У меня есть и стол 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
@TimBiegeleisen: SQL Server 2017
Вы можете использовать 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
Пожалуйста, используйте >=
или <=
вместо <
и >
в соответствии с вашими требованиями.
Какую версию SQL вы используете (например, MySQL, SQL Server, Postgres и т. д.)?