У меня есть следующая таблица базы данных с информацией о людях, болезнях и лекарствах:
PERSON_T DISEASE_T DRUG_T
========= ========== ========
PERSON_ID DISEASE_ID DRUG_ID
GENDER PERSON_ID PERSON_ID
NAME DISEASE_START_DATE DRUG_START_DATE
DISEASE_END_DATE DRUG_END_DATE
Из этих таблиц я получаю некоторую статистику о том, какие люди принимали какие лекарства и какие заболевания у них были. Из этого я могу понять, какие паттерны мне интересны для дальнейшего изучения. Например, ниже приведен упрощенный пример логического шаблона, который я мог бы найти для болезни 52:
( (Drug 234 = false AND Drug 474 = true AND Drug 26 = false) OR
(Drug 395 = false AND Drug 791 = false AND Drug 371 = true) )
Изменить: Вот еще один пример:
( (Drug 234 = true AND Drug 474 = true AND Drug 26 = false) OR
(Drug 395 = false AND Drug 791 = false AND Drug 371 = true) )
Теперь я хочу преобразовать этот шаблон в SQL-запрос и найти всех людей, которые соответствуют этому шаблону.
Например, я хочу найти всех людей в PERSON_T, у которых было заболевание и ((кто не принимал наркотики 234 и 26 до появления симптомов, но принимали препарат 474 до появления симптомов) или (которые принимали препарат 371 до появления симптомов, но не принимали препараты 791 и 395 до появления симптомов))
Как мне перевести этот шаблон обратно в исходный запрос?
Вот моя первая попытка, но я застрял на первом термине:
SELECT * FROM PERSON_T, DRUG_T, DISEASE_T
WHERE DISEASE_ID = 52 AND
PERSON_T.PERSON_ID = DISEASE_T.PERSON_ID AND
PERSON_T.PERSON_ID = DRUG_T.PERSON_ID AND
(DRUG_T.DRUG_ID=234 AND (DRUG_T.DRUG_START_DATE>DISEASE_T.END_DATE || ???)
Мне нужно, чтобы это работало в PostgreSql, но я предполагаю, что любой данный ответ может быть переведен из данной базы данных в PostgreSql.
Ответ на комментарии
- Я исправил форматирование таблиц базы данных. Спасибо.
- Мне нужно иметь возможность взять произвольный логический оператор и перевести его в SQL. Логические операторы, которые мы на самом деле создаем, намного длиннее, чем приведенный мной пример. Любые новые таблицы, которые я создаю, будут находиться в новой базе данных и должны иметь ту же схему, что и исходные таблицы. Таким образом, конечный пользователь может запустить свой код на новых таблицах, и он будет работать так же, как если бы он работал на исходных таблицах. Это требование от заказчика. Я надеюсь, что смогу создать представление, которое является просто запросом к исходным таблицам. Если мы не сможем заставить это работать, я могу создать копию таблиц и отфильтровать данные по мере их копирования в новую таблицу. Мы не используем нейронные сети для анализа. Мы используем собственные алгоритмы, которые масштабируются намного лучше, чем нейронные сети.
- Болезнь_начала_дата — это дата, когда у человека появляется заболевание, которое, вероятно, когда начинают появляться симптомы. Disease_End_Date — это когда человек выздоравливает, что, вероятно, происходит, когда симптомы исчезают.
- Drug_start_date — это когда человек начинает принимать наркотики. Drug_end_date — это когда человек прекращает принимать наркотики.
Изменить Я добавил свой ответ. Кто-нибудь может дать более простой ответ?