SQL для запроса зависимостей по дате

У меня есть таблица пациентов, в которой есть следующие столбцы: идентификатор_пациента, идентификатор_обс, дата_обс. Obs_id — это идентификатор клинического наблюдения (например, показания веса, показания артериального давления и т. д.), а obs_date — это время, когда это наблюдение было выполнено. У каждого пациента может быть несколько показаний в разные даты... и т.д. В настоящее время у меня есть запрос, чтобы получить всех пациентов с obs_id = 1 и вставить их во временную таблицу (имеет два столбца,patient_id и флаг, который я установил здесь равным 0):

insert into temp_table (select patient_id, 0 from patients_table 
where obs_id = 1 group by patient_id having count(*)   >= 1)

Я также выполняю оператор обновления, чтобы установить флаг в 1 для всех пациентов, у которых также был obs_id = 5:

UPDATE temp_table SET flag = 1 WHERE EXISTS ( 
  SELECT patient_id  FROM patients_table WHERE obs_id = 5 group by patient_id having   count(*)     >=1
 ) v  WHERE temp_table.patient_id = v.patient_id

Вот мой вопрос: как мне изменить оба запроса (без их объединения или удаления группы по оператору), чтобы я мог ответить на следующий вопрос: «получить всех пациентов, у которых obs_id = 5 после obs_id = 1». Если я добавлю min(obs_date) или max(obs_date) к выбору каждого запроса, а затем добавлю "AND v.obs_date > temp_table.obs_date" ко второму, это правильно??

Причина, по которой мне не нужно удалять группу по оператору или объединять, заключается в том, что эти запросы генерируются генератором кода (из веб-приложения), и я хотел бы сделать эту модификацию, не испортив генератор кода или переписывая его. .

Спасибо заранее,


person wsb3383    schedule 19.08.2010    source источник


Ответы (1)


Преимущество SQL в том, что он работает с множествами. Вам не нужно создавать временные таблицы или делать все процедурно.

Поскольку вы описываете проблему (найти всех пациентов, у которых obs_id 5 после obs_id 1), я бы начал с чего-то вроде этого

select distinct p1.patient_id 
from patients_table p1, patients_table p2 
where 
p1.obs_id = 1 and
p2.obs_id = 5 and
p2.patient_id = p1.patient_id and
p2.obs_date > p1.obs_date

Конечно, это не поможет вам справиться с генератором кода. Иногда инструменты, упрощающие задачу, также могут мешать.

person Jim Hudson    schedule 20.08.2010
comment
спасибо, я полностью понимаю. Однако я не реализовал этот генератор кода, я просто модифицирую чужой код. Изменение общей стратегии генерации кода для меня не вариант, поэтому я борюсь с этим. - person wsb3383; 20.08.2010