Использование "для цикла" в SAS SQL? - PullRequest
0 голосов
/ 17 мая 2018

Я использую SQL в SAS. У меня есть много похожих имен переменных в моих данных, таких как «var1, var2, ..., var100». Я знаю, что это может быть написано как

proc sql; select xx from xxx where var1 = a or var2 =a or var3 =a;run; 

Интересно, есть ли в SQL функция типа "цикл", чтобы упростить эту задачу?

Спасибо за вашу помощь!

Ответы [ 6 ]

0 голосов
/ 18 мая 2018

Вы можете макроварировать, а затем использовать его.Но это долгий утомительный процесс, и процесс обработки данных намного проще.Вы можете сделать это в proc sql, как показано ниже.

/*first create dataset to test*/
data have;
  input var1 var2 var3 var4 newvar  a;
  datalines;
 10 20 30 40 60 10
10 20 30 40 60 90
10 20 30 40 60 20
;
run;

 /* create macro variable*/
 proc sql;
   select catt(name, "  =  ", " a  or ") into :VAR SEPARATED by " "  
 from  dictionary.columns 
 where memname = 'HAVE'
 and prxmatch("m/^VAR\d+$/i", trim(name)) > 0;/* to find variable var with  digit*/

%put &VAR;

Это дает var1 = a или var2 = a или var3 = a или var4 = a или

/* do a substring to remove last or */
%let final_var = %substr(&var, 1, %length(&var)-2);

%put &final_var;

Это дает var1= a или var2 = a или var3 = a или var4 = a

 /*Now you can use the macro variable in your query, will give you desired 
result*/

proc sql;
select * from have
where &final_var;
0 голосов
/ 18 мая 2018

Как указал Том, на шаге данных это будет значительно проще:

data want;
   set xxx;
where whichc('a', of var1-var1000);
run;
0 голосов
/ 18 мая 2018

Вы можете использовать функцию WHICH() или WHICHC(), чтобы выполнить этот тип теста. Он вернет индекс первой соответствующей переменной и ноль, если ни одна не совпадает. SAS будет рассматривать 0 как ложное.

where which(a,var1,var2,var3)

К сожалению, если вы используете PROC SQL, вы должны перечислить каждое имя переменной. В отличие от шага DATA, он не поддерживает списки переменных.

0 голосов
/ 17 мая 2018

Вы можете использовать макросы для выполнения работы.Например:

%macro loopQuery;

  proc sql; 
    select xx 
    from xxx 
    where var1 = a 
     %do i=2 %to 100;
       or var&i.=a
     %end;
    ;
  run; 
%mend;

%loopQuery;
0 голосов
/ 17 мая 2018

Насколько я знаю, в каждом взаимодействии с SAS есть Do функциональность цикла.

IIRC, я думаю, что он работает примерно так:

%do i=1 %to [##];
     ... do iterative stuff ...
%end;
0 голосов
/ 17 мая 2018

В зависимости от варианта базы данных, вы можете сделать это:

... WHERE a IN (var1, var2, var3, etc);

но это будет лучшее, что вы можете сделать, и я не знаю, поддерживает ли это SAS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...