Вы, по сути, хотите создать запрос cross-tab с наркотиками. Хотя есть много инструментов OLAP, которые могут делать такие вещи (среди всех видов других нарезки и обработки данных), делать что-то подобное в традиционном SQL нелегко (и вообще невозможно обойтись без какой-то процедурный синтаксис во всех, кроме простейших сценариях).
Вы в основном есть два варианта, когда делать это с помощью SQL (ну, точнее, у вас есть один варианта, и еще более сложный, но гибкий вариант, производные от него):
- Используйте серию
CASE
в вашем запросе для создания столбцов, которые являются репрезентативными для каждого отдельного препарата. Для этого требуется , зная список переменных значений (например, лекарств) досрочно
- Использовать процедурный язык SQL, такой как T-SQL, для динамического построения запроса, который использует операторы case, как описано выше, но наряду с получением этого список значений из самих данных.
Эти два варианта, по сути, делают то же самое, вы просто торгуете простотой и легкостью обслуживания для обеспечения гибкости во втором варианте.
Например, используя вариант 1:
select
p.NAME,
p.GENDER,
(case when d.DISEASE_ID is null then 0 else 1 end) as HAD_DISEASE,
(case when sum(case when dr.DRUG_ID = 1 then 1 else 0 end) > 0 then 1 else 0 end) as TOOK_DRUG_1,
(case when sum(case when dr.DRUG_ID = 2 then 1 else 0 end) > 0 then 1 else 0 end) as TOOK_DRUG_2,
(case when sum(case when dr.DRUG_ID = 3 then 1 else 0 end) > 0 then 1 else 0 end) as TOOK_DRUG_3
from PERSON_T p
left join DISEASE_T d on d.PERSON_ID = p.PERSON_ID and d.DISEASE_ID = @DiseaseId
left join DRUG_T dr on dr.PERSON_ID = p.PERSON_ID and dr.DRUG_START_DATE < d.DISEASE_START_DATE
group by p.PERSON_ID, p.NAME, p.GENDER, d.DISEASE_ID
Как вы можете сказать, это становится немного трудоемким, как вы получите за пределами всего несколько потенциальных значений.
Другой вариант - построить этот запрос динамически.Я не знаю, PostgreSQL и что, если таковые имеются, процедурные возможностями она имеет, но в целом процедура будет следующим образом:
- Собирает список потенциальных
DRUG_ID
значений наряду с именами для колонн
- Подготовьте три строковые значений : префикс SQL (все до первого связанного с наркотиками оператора
CASE
, SQL stuffix (все после последнего связанного с наркотиками оператора CASE
) и динамической части
- Построить динамическую часть путем объединения лекарственного средства
CASE
операторов, основанных на ранее извлеченный список
- Объедините их в один (надеюсь, действительный) оператор SQL и выполните
Является ли это точным представлением проблемной области - то есть. вы заинтересованы в лечении пациентов/болезней/наркотиков, или это переработка совершенно другой темы с аналогичными отношениями? Если это первый, есть ли дополнительные таблицы для конкретных лекарств и болезней (в отличие от того, когда они были связаны с конкретным пациентом), и есть ли еще одна таблица, в которой можно было бы применить конкретный препарат к определенному заболеванию (возможно, с противопоказанием -инфекции - например, не лечить гипертензию таблеток с солью)? –