SQL:选择一个分类值并排除其他值

时间:2018-06-13 12:43:10

标签: sql sql-in

我有一张患者身份证表和他们使用的药物。如果患者药物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"对于分类价值和选择停止使用某些药物的患者?

3 个答案:

答案 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)上创建索引。