哈希合并键变量包含空格

时间:2018-12-07 16:06:08

标签: hash merge sas

我目前正在学习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;

2 个答案:

答案 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步骤之前应用它。
  • 如果键变量名在tablex和查找中相同,则可以使用更简单的hash.find()。仅当名称不对齐时才需要hash.find(key:<expression>),或者必须在一个域中的键进行转换后才能进行适当的查找(例如,在对输入的文本进行散列并然后与主登录表进行比较)