在平时写程序的时候,有时候我们在LOG中会看到类似下图的提示,而实际上笛卡尔积可能又的确是我们所要的结果。下面介绍几种产生笛卡尔积的方法。
设有两个数据集如下,假设我们要的结果是A <= ID <= C:
- PROC SQL:
proc sql; create table want as select a.*, b.* from demo1 a, demo2 b where A <= ID <= B ; quit;
- DATA步:
data want; set demo1; do i=1 to n; set demo2 point=i nobs=n; if A <= ID <= B then output; end; run;
- 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'的时候可以使用后面两种方法。