我有以下数据库表,其中包含有关人员、疾病和药物的信息:
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_Start_Date 是人得病的日期,很可能是症状开始出现的时候。疾病结束日期是患者康复的时间,很可能是症状消失的时间。
- Drug_start_date 是该人开始服药的时间。Drug_end_date 是该人停止服药的时间。
编辑 我添加了自己的答案。谁能想出一个更简单的答案?