我目前正在学习Hash合并,并且在这里有些挣扎。
第一个问题是在进行哈希合并时应对哪些表进行哈希处理,以及应使用set语句读取哪些表?在下面的示例中,Tablex在SQL服务器上,并具有几百万条记录。 Table1的记录是Tablex的10%,并且在我的工作临时文件夹中。
我只想从TableX中选择出现在Table1中的记录,下面的代码是否是一个好的方法?如果我也想对TableX进行条件处理,并说出打开日期> '01 DEC 2010'
还有可能有一个以空格作为键变量的变量,还是我必须做重命名位?
Data merges;
if 0 then set server.Tablex(rename='account number'n=
account_number_full2) table1;
if _n_ = 1 then do;
declare hash tab2(dataset:'table1');
tab2.defineKey('Account_Number_full');
tab2.defineData(all:'YES');
tab2.defineDone();
end;
set Tablex(rename='account number'n= account_number_full2);
if tab2.find(key:account_number_full2) = 0
then output;
run;
答案 0 :(得分:0)
让我们尝试通过一个例子来理解。您在set语句中提到的内容是在这种情况下的输出have1表。您的哈希表是have。如果 n = 0,则仅对set表需要set have1。哈希表不需要 all ,因为您没有将数据用于最终输出表。
data have;
input id value $;
datalines;
1 A
2 B
3 C
4 D
;
data have1;
input id date:mmddyy10.;
format date mmddyy10.;
datalines;
2 01/15/2018
3 01/01/2017
;
Data merges;
if 0 then set have1;
if _n_ = 1 then do;
declare hash tab2(dataset:'have');
tab2.defineKey('id');
tab2.defineDone();
end;
set have1;
if tab2.find(key:id) = 0
;
run;
如果要包括日期,可以执行where子句作为数据集选项,如下所示。
Data merges;
if 0 then set have1;
if _n_ = 1 then do;
declare hash tab2(dataset:'have');
tab2.defineKey('id');
tab2.defineDone();
end;
set have1(where= (date gt '01JAN2018'd));
if tab2.find(key:id) = 0;
run;
答案 1 :(得分:0)
仅当SAS会话已打开时,哈希中的变量名称可以包含任何字符
option validvarname = any;
如果要导入Excel数据或数据源的列不符合典型的名称命名约定,则可以设置此选项-以_或字母开头,后跟任意数量的_,字母或数字。
在DATA步骤代码中引用异常命名的列时,您将不得不使用SAS名称-文字语法(引用引用后跟N),但是,在将列名称传递给哈希构造函数(作为字符串)时,您将使用名称,而不使用名称文字:
"<column-name>"N
示例代码:
options validvarname = any;
data have;
"my key name is spacey"N = "key-1"; **** name-literal syntax used here;
x = 123;
run;
data _null_;
if 0 then set have; * prep pdv;
if _n_ = 1 then do;
declare hash h(dataset:'have');
h.defineKey("my key name is spacey"); **** name with spaces passed here;
h.defineData("x");
h.defineDone();
end;
'my key name is spacey'N = "key-0"; **** name-literal used here;
rc = h.find();
put rc= x=;
'my key name is spacey'N = "key-1"; **** name-literal used here;
rc = h.find();
put rc= x=;
run;
关于加入。
where
应用于远程表。 SQLSRV数据库引擎会将条件传递给SQL,并会在通过“线路”将数据发送回DATA步骤之前应用它。hash.find()
。仅当名称不对齐时才需要hash.find(key:<expression>)
,或者必须在一个域中的键进行转换后才能进行适当的查找(例如,在对输入的文本进行散列并然后与主登录表进行比较)