0

我需要进行查询并在其中使用该IN语句。

首先我读了一个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;

我总是遇到一个众所周知的问题:

语法错误,应为以下之一:带引号的字符串、数字常量、日期时间常量、缺失值、-。

IN如何在语句中使用字母数字变量?为什么它不能与它一起工作 - 没有引用字母数字字符串?语句中需要什么样的数据结构IN

4

2 回答 2

2

您可以使用 proc sql 来执行此操作。您可能需要向 company_symbol 添加修剪和压缩,以确保空格不会破坏 company_symbol 和 smbl 之间的任何匹配

这将从 mydata 中选择 company_symbol 与表 sp500 中的 smbl 匹配的所有字段

proc sql noprint;

    create table result as
    select *
    from mydata
    where company_symbol in (select distinct smbl from sp500)
    ;
quit;
于 2013-11-11T20:15:34.007 回答
1

斯科特的答案绝对是一个好答案,但这里有一些替代方案。

首先,最接近您实际编写的方法是将术语括在引号中,将它们选择到宏变量中,然后在数据步骤中使用它们:

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;

这需要对它们进行排序,并且两者中的变量名称相同(如果需要,您可以在合并语句中的一个数据集上使用 RENAME)。SQL 内连接会做同样的事情,而且不需要显式排序,尽管它可能会在不告诉你的情况下为你排序数据(因此不会节省时间)。取决于哈希解决方案是否有效(如果有效,则不必排序)。


如果排序对您来说是一个额外的步骤(即,如果通常不以这种方式排序),格式通常会更快。

数据for_fmts;设置sp500;fmtname='$SMBLF'; 开始=smbl;标签="1"; *或任何你想要的TRUE;输出; 如果n =1 则执行;hlo='o'; *这会检查不匹配;开始=''; 标签='0'; *或任何你想要的FALSE;输出; 结尾; 跑;

*必须是smbl的NODUPKEY,所以如果有重复,做一个proc sort nodupkey;

proc 格式 cntlin=for_fmts; 辞职;

数据结果;设置我的数据;where put(company_symbol,$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;
于 2013-11-11T21:22:56.950 回答