SQL - пациент с визитом в офис за год до последнего - PullRequest
1 голос
/ 21 октября 2010

Я пытаюсь написать запрос, который возвращает пациентов, которые были в офисе по крайней мере за год до последнего. Различные способы, которыми я размышляю, запутываются в моей голове, поэтому мне было интересно, может ли кто-нибудь найти очевидный способ написать это, что я скучаю. Не беспокойтесь о точном синтаксисе и именах - я должен быть в состоянии перевести его. : -)

Спасибо!

Ответы [ 4 ]

3 голосов
/ 21 октября 2010

Использование:

SELECT ph.*
  FROM PATIENT_HISTORY ph
 WHERE ph.visit_date >= (SYSDATE - 365)

... или:

SELECT ph.*
  FROM PATIENT_HISTORY ph
 WHERE ph.visit_date >= ADD_MONTHS(SYSDATE, -12)

ADD_MONTHS говорит само за себя.В Oracle SYSDATE возвращает текущую дату и время, и вы можете манипулировать Oracle DATE (включая время), добавляя / вычитая число (которое интерпретируется как количество дней).

Для пациентов сзапись, которая год или более в прошлом:

SELECT a.*
  FROM PATIENT_HISTORY a
 WHERE EXISTS(SELECT NULL
                FROM PATIENT_HISTORY b
               WHERE b.visit_date <= ADD_MONTHS(a.visit_date, -12))
1 голос
/ 22 октября 2010

Это довольно просто сделать с помощью WINDOW FUNCTIONS в Oracle.

Если ваша таблица VISITS выглядит примерно так:

create table visits (
    patient_id number,
    visit_date date,
    ....
);

Вы можете использовать этот простой запрос:

select patient_id, visit_date, 
       lead(visit_date, 1, null) 
           over (partition by patient_id order by visit_date) as next_visit_date
  from visits;

И получит в один ряд значение visit_date и следующее значение visit_date для того же пациента.

Затем с помощью простого, где вы можете проверить состояние вашего один год .

1 голос
/ 21 октября 2010

Если вы хотите определить, лечился ли пациент в течение как минимум одного года (как это звучит в вашем комментарии), вы не могли бы выполнить такой запрос:

SELECT *
FROM Patients p
WHERE 
    DATEDIFF(d, 
             (SELECT MIN(AppointmentDate) FROM Appointments a WHERE a.PatientID = p.PatientID),
             (SELECT MAX(AppointmentDate) FROM Appointments a WHERE a.PatientID = p.PatientID)) >= 365

Я не знаю, будет ли этот синтаксис работать случайным образом, но концепция заключается в том, чтобы сказать: «Верните только тех пациентов, у которых число дней с момента их самого раннего и самого последнего посещения составило не менее 365 дней.

1 голос
/ 21 октября 2010
select distinct * from PatientHistory
where lastVisit = date_sub(lastVisit,interval 1 year)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...