SAS中产生笛卡尔积的几种方法

在平时写程序的时候,有时候我们在LOG中会看到类似下图的提示,而实际上笛卡尔积可能又的确是我们所要的结果。下面介绍几种产生笛卡尔积的方法。

Cartesian1

设有两个数据集如下,假设我们要的结果是A <= ID <= C:

Cartesian2

    1. PROC SQL
      proc sql;
          create table want as
              select a.*, b.*
              from demo1 a, demo2 b
              where A <= ID <= B
              ;
      quit;
      
    2. DATA步:
      data want;
          set demo1;
          do i=1 to n;
              set demo2 point=i nobs=n;
              if A <= ID <= B then output;
          end;
      run;
      
    3. HASH
      data want;
          if _n_=1 then do;
              if 0 then set demo2;
              dcl hash h(dataset:'demo2');
              dcl hiter hit('h');
              h.definekey('C');
              h.definedata('A', 'B', 'C');
              h.definedone();
          end;
          set demo1;
          do while(hit.next()=0);
              if A <= ID <= B then output;
          end;
      run;
      

通过RUN程序我们可以发现后面两种方法在LOG中不会有产生笛卡尔积的提示,故当LOG有要求检查关键字'Cartesian Product'的时候可以使用后面两种方法。

曾宪华 /
本文采用 署名-非商业性使用-相同方式共享 3.0许可协议 属于 程序人生 分类, 被贴了 Cartesian Product Hash Object PROC SQL 笛卡尔积 书签

上一篇 一个关于SAS转置的问题
下一篇 SAS自定义函数获取某逻辑库下所有表名