PROC SQL, где условие - PullRequest
       10

PROC SQL, где условие

0 голосов
/ 08 апреля 2019

Я пытаюсь удалить ряд записей, в которых переменная REASON_FOR_VISIT варьируется от психических до проблем с астмой, и СОХРАНИТЬ пациентов, у которых острота равна 3. Однако, когда я запускаю этот код и выполняю процедуру частоты REASON_FOR_VISIT, я все ещеполучить результаты, содержащие ключевые слова записей, которые я хочу удалить.

proc sql;
create table NoPysch as
Select *
from ED_TAT
Where 
    Pt_Acuity like '%3%'
    AND TRACK_Group like '%ED Tracking%'
    AND REASON_FOR_VISIT not like '%asth%' 
AND REASON_FOR_VISIT not like '%asthma%' 
AND REASON_FOR_VISIT not like '%asthma/%' 
    AND REASON_FOR_VISIT not like '%suicidal%' 
AND REASON_FOR_VISIT not like '%assualt%' 
AND REASON_FOR_VISIT not like '%assult%'
AND REASON_FOR_VISIT not like '%APA%' 
AND REASON_FOR_VISIT not like '%legal%'  
AND REASON_FOR_VISIT not like '%suicide%'
AND REASON_FOR_VISIT not like 'ASA'
AND REASON_FOR_VISIT not like '/ASA'
AND REASON_FOR_VISIT not like '%SI/%'
AND REASON_FOR_VISIT not like '%SI, attempt%'
AND REASON_FOR_VISIT not like '%SI w%'
AND REASON_FOR_VISIT not like 'SI'
AND REASON_FOR_VISIT not like 'HI'
AND REASON_FOR_VISIT not like '%homicide%'
AND REASON_FOR_VISIT not like '%psyc%'
AND REASON_FOR_VISIT not like '%psch%'
AND REASON_FOR_VISIT not like '%FD-12%'
AND REASON_FOR_VISIT not like '%behavior%'
AND REASON_FOR_VISIT not like '%behav%'
AND REASON_FOR_VISIT not like '%overdose%'
AND REASON_FOR_VISIT not like '%agitation%'
    AND REASON_FOR_VISIT not like '%aggression%'
AND REASON_FOR_VISIT not like '%psy eval%';
run; 

proc freq data=NoPysch;
table REASON_FOR_VISIT;
run;

1 Ответ

0 голосов
/ 08 апреля 2019

Вместо того, чтобы загрязнять ваш код критериями фильтрации, рассмотрите возможность помещения подобных целей в отдельную таблицу поиска.Одна из форм проверки значения на наличие или отсутствие присутствия в таблице поиска называется экзистенциальным суб-выбором.

Большинство целей имеют «содержащую» природу, как указано в %<target>%, а некоторые не имеют подстановочных знаков, таких как 'SI', 'HI', которые должны точно соответствовать по порядкудля фильтрации.

Если все элементы действительно соответствуют «содержащему» типу соответствия, просто укажите целевые значения в таблице поиска и добавьте скобку % к коду в запросе дополнительного выбора.Если вы хотите иметь все разновидности одинаковых совпадений (начинаются с <target>%, заканчиваются %<target> или содержат %<target>%, цели поиска должны будут включать подстановочные знаки.

Например, экзистенциальный запроспроверяет все фильтры причины из-за NOT EXISTS . Если выражение фильтра не соответствует причине, будет выбрана запись.

data reason_like_filter;
input; 
expression = _infile_;
datalines4;
%asth%
%asthma%
%asthma/%
%suicidal%
%assualt%
%assult%
%APA% 
%legal%  
%suicide%
ASA
/ASA
%SI/%
%SI, attempt%
%SI w%
SI
HI
%homicide%
%psyc%
%psch%
%FD-12%
%behavior%
%behav%
%overdose%
%agitation%
%aggression%
%psy eval%
;;;;

data ed_tat;
  pt_acuity = 'AABB3DDEE';
  track_group = 'Regional ED Tracking base';
  length pid 8 reason_for_visit $50;
  input pid reason_for_visit;
  infile cards dsd dlm=',';
datalines;
1, "Suicide"
2, "Suicidal"
3, "Psy eval mm//dd/yy"
4, "Drop off cookies"
5, "Visit friend"
6, "Heart attack"
run;

proc sql;
  create table want as
  select * 
  , (
select count(*)
      from reason_like_filter FILTER
      where upcase(REASON_FOR_VISIT) LIKE upcase(FILTER.expression)
) as N

  from ED_TAT
  where 
   Pt_Acuity like '%3%'
   AND TRACK_Group like '%ED Tracking%'
   AND NOT EXISTS (
      select *
      from reason_like_filter FILTER
      where upcase(REASON_FOR_VISIT) LIKE trim(upcase(FILTER.expression))
   )
   ;
quit;
...