Sas 在字母数字字符串变量的语句中使用
我需要进行查询,并在其中使用语句中的Sas 在字母数字字符串变量的语句中使用,sas,Sas,我需要进行查询,并在其中使用语句中的 首先,我在一个txt文件中读取: filename ticklist '/home/mypath/myfile.txt'; data sp500; infile ticklist; input smbl $; smbl=upcase(smbl); run; 这给了我变量sp500.smbl的值AA,HNZ,…(超过500) 然后我提出一个问题: data result; set mydata; where
首先,我在一个txt文件中读取:
filename ticklist '/home/mypath/myfile.txt';
data sp500;
infile ticklist;
input smbl $;
smbl=upcase(smbl);
run;
这给了我变量sp500.smbl
的值AA,HNZ,…
(超过500)
然后我提出一个问题:
data result;
set mydata;
where also company_symbol IN (sp500.smbl);
run;
我总是得到一个众所周知的问题:
语法错误,应为以下内容之一:带引号的字符串、数值常量、日期时间常量、缺少的值,-
如何将字母数字变量与
语句中的一起使用?为什么不能使用它呢?字母数字字符串没有被引用吗?在
语句中的需要什么样的数据结构?您可以使用proc sql来实现这一点。您可能需要将修剪和压缩添加到company_符号,以确保空格不会破坏company_符号和smbl之间的任何匹配
这将从mydata中选择公司符号与表sp500中的smbl匹配的所有字段
proc sql noprint;
create table result as
select *
from mydata
where company_symbol in (select distinct smbl from sp500)
;
quit;
您可以使用procsql来实现这一点。您可能需要将修剪和压缩添加到company_符号,以确保空格不会破坏company_符号和smbl之间的任何匹配
这将从mydata中选择公司符号与表sp500中的smbl匹配的所有字段
proc sql noprint;
create table result as
select *
from mydata
where company_symbol in (select distinct smbl from sp500)
;
quit;
您可以使用procsql来实现这一点。您可能需要将修剪和压缩添加到company_符号,以确保空格不会破坏company_符号和smbl之间的任何匹配
这将从mydata中选择公司符号与表sp500中的smbl匹配的所有字段
proc sql noprint;
create table result as
select *
from mydata
where company_symbol in (select distinct smbl from sp500)
;
quit;
您可以使用procsql来实现这一点。您可能需要将修剪和压缩添加到company_符号,以确保空格不会破坏company_符号和smbl之间的任何匹配
这将从mydata中选择公司符号与表sp500中的smbl匹配的所有字段
proc sql noprint;
create table result as
select *
from mydata
where company_symbol in (select distinct smbl from sp500)
;
quit;
斯科特的答案肯定是好的,但这里有一些选择
首先,最接近您实际编写内容的方法是将术语括在引号中,将它们选择到宏变量中,然后在数据步骤中使用它们:
proc sql;
select quote(smbl) into :smbllist separated by ' '
from sp500;
quit;
data result;
set mydata;
where company_symbol in (&smbllist.);
run;
这不是一个特别好的方法,但它是有效的
备选方案:
数据步合并(或SQL连接)通常比比较中的好,因为它更好地利用了哈希/索引等
data result;
merge mydata(in=a) sp500(in=sp);
by company_symbol;
if a and sp;
run;
这需要对它们进行排序,并且两者的变量名相同(如果需要,可以在merge语句中的一个数据集上使用RENAME)。SQL内部联接也会做同样的事情,而且不需要显式排序,尽管它可能会在不告诉您的情况下为您排序数据(因此不会节省时间)。取决于哈希解决方案是否有效(如果有效,则无需排序)
如果排序对您来说是一个额外的步骤(即,如果通常不是以这种方式排序),则格式通常会更快
_fmts的数据;
设置sp500;
fmtname='$SMBLF';
开始=smbl;
label=“1”*或者你想要的任何东西都是真的;
产出;
如果n=1,则执行;
hlo='o'*这将检查是否存在不匹配;
开始='';
label='0'*或任何你想要的虚假;
产出;
结束;
运行
*smbl必须是NODUPKEY,因此如果存在重复项,则执行proc sort NODUPKEY
proc format cntlin=用于_fmts;
退出
数据结果;
设置mydata;
其中put(公司符号,$SMBLF.)为'1';
运行
哈希表是最接近您在面向对象思想方面实际编写的内容
data result;
if _n_=1 then do;
if 0 then set sp500;
declare hash sp('dataset:sp500');
sp.defineKey('smbl');
sp.defineData('smbl'); *or whatever you want to return when found, if something;
sp.defineDone();
call missing (smbl); *initialize to missing to avoid warning;
end;
set mydata;
rc = sp.find(key:company_symbol);
if rc eq 0 then output; *or you could do this in one statement, skipping the rc, just being clear here;
run;
斯科特的答案肯定是好的,但这里有一些选择
首先,最接近您实际编写内容的方法是将术语括在引号中,将它们选择到宏变量中,然后在数据步骤中使用它们:
proc sql;
select quote(smbl) into :smbllist separated by ' '
from sp500;
quit;
data result;
set mydata;
where company_symbol in (&smbllist.);
run;
这不是一个特别好的方法,但它是有效的
备选方案:
数据步合并(或SQL连接)通常比比较中的好,因为它更好地利用了哈希/索引等
data result;
merge mydata(in=a) sp500(in=sp);
by company_symbol;
if a and sp;
run;
这需要对它们进行排序,并且两者的变量名相同(如果需要,可以在merge语句中的一个数据集上使用RENAME)。SQL内部联接也会做同样的事情,而且不需要显式排序,尽管它可能会在不告诉您的情况下为您排序数据(因此不会节省时间)。取决于哈希解决方案是否有效(如果有效,则无需排序)
如果排序对您来说是一个额外的步骤(即,如果通常不是以这种方式排序),则格式通常会更快
_fmts的数据;
设置sp500;
fmtname='$SMBLF';
开始=smbl;
label=“1”*或者你想要的任何东西都是真的;
产出;
如果n=1,则执行;
hlo='o'*这将检查是否存在不匹配;
开始='';
label='0'*或任何你想要的虚假;
产出;
结束;
运行
*smbl必须是NODUPKEY,因此如果存在重复项,则执行proc sort NODUPKEY
proc format cntlin=用于_fmts;
退出
数据结果;
设置mydata;
其中put(公司符号,$SMBLF.)为'1';
运行
哈希表是最接近您在面向对象思想方面实际编写的内容
data result;
if _n_=1 then do;
if 0 then set sp500;
declare hash sp('dataset:sp500');
sp.defineKey('smbl');
sp.defineData('smbl'); *or whatever you want to return when found, if something;
sp.defineDone();
call missing (smbl); *initialize to missing to avoid warning;
end;
set mydata;
rc = sp.find(key:company_symbol);
if rc eq 0 then output; *or you could do this in one statement, skipping the rc, just being clear here;
run;
斯科特的答案肯定是好的,但这里有一些选择
首先,最接近您实际编写内容的方法是将术语括在引号中,将它们选择到宏变量中,然后在数据步骤中使用它们:
proc sql;
select quote(smbl) into :smbllist separated by ' '
from sp500;
quit;
data result;
set mydata;
where company_symbol in (&smbllist.);
run;
这不是一个特别好的方法,但它是有效的
备选方案:
数据步合并(或SQL连接)通常比比较中的好,因为它更好地利用了哈希/索引等
data result;
merge mydata(in=a) sp500(in=sp);
by company_symbol;
if a and sp;
run;
这需要对它们进行排序,并且两者的变量名相同(如果需要,可以在merge语句中的一个数据集上使用RENAME)。SQL内部联接也会做同样的事情,而且不需要显式排序,尽管它可能会在不告诉您的情况下为您排序数据(因此不会节省时间)。取决于哈希解决方案是否有效(如果有效,则无需排序)
如果排序对您来说是一个额外的步骤(即,如果通常不是以这种方式排序),则格式通常会更快
_fmts的数据;
设置sp500;
fmtname='$SMBLF';
开始=smbl;
label=“1”*还是什么