我有一张患者身份证表和他们使用的药物。如果患者药物A失败,他们将使用B,而进一步的耐药性导致药物C,依此类推。
我想找出使用某种药物的患者(即' B')并在没有尝试新药的情况下停在那里。如果药物清单很短,我的代码很愚蠢而效率不高。
PatientID MedicationName
13 A
13 B
13 C
32 A
32 A+
32 B
32 C
38 A
38 C
38 D
42 B
42 F
42 G
53 E
53 F
select *
from PatientMaster
where MedicationName = 'B'
and PatientID not in (
select PatientID
from PatientMaster
where MedicationName in ( 'C', 'D', 'E', 'F', 'G' ))
如果我的MedicationName列表包含> 1000个名字,我怎么能有一个" cut-off"对于分类价值和选择停止使用某些药物的患者?
答案 0 :(得分:0)
我会尝试这样的事情,使用子查询来确保特定患者有单一药物(B):
select *
from PatientMaster p1
join ( select PatientID
from PatientMaster
group by PatientID
having count(MedicationName) = 1
) p2 on p1.PatientID = p2.PatientID
where MedicationName = 'B'
答案 1 :(得分:0)
您可以使用序列(如果使用ORACLE)或身份来记录这些药物条目。因此,我们会知道,首先尝试了哪种药物。
您可以在SQL SERVER中使用以下查询。
;WITH CTE_StoppedMedication AS
(
SELECT PatientId,MedicationName AS StoppedAtMedication
FROM patientLog AS Plo
WHERE PatientLogId = (SELECT MAX(PatientLogId)FROM PatientLog AS Pli
WHERE Pli.PatientId = Plo.PatientId)
)
SELECT * FROM CTE_StoppedMedication
WHERE StoppedAtMedication = 'B;
答案 2 :(得分:0)
尝试将您的查询编写为:
select pm.*
from PatientMaster pm
where pm.MedicationName = 'B' and
not exists (select 1
from PatientMaster pm2
where pm2.patientID = p.patientID and
pm2.MedicationName in ( 'C', 'D', 'E', 'F', 'G'
);
然后,在PatientMaster(patientId, MedicationName)
和PatientMaster(MedicationName)
上创建索引。