SQL: выберите одно категориальное значение и исключите другие - PullRequest
0 голосов
/ 13 июня 2018

У меня есть таблица идентификатора пациента и лекарства, которые они используют.Если пациент отказывается от препарата А, он будет использовать В, в то время как дальнейшая лекарственная устойчивость ведет к препарату С и так далее.

Я хочу найти пациентов, которые употребляют определенное лекарство (например, «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 имен, как у меня есть своего рода «отсечение» для категориального значения ивыбрать пациентов, которые остановились на определенных препаратах?

Ответы [ 3 ]

0 голосов
/ 13 июня 2018

У вас может быть последовательность (если используется 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;
0 голосов
/ 13 июня 2018

Попробуйте написать запрос как:

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).

0 голосов
/ 13 июня 2018

Я бы попробовал что-то вроде этого, используя подзапрос, который гарантирует, что для конкретного пациента есть один препарат (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'
...