SAS:合并proc sql和data步骤

时间:2018-08-10 18:21:04

标签: sas

对不起,我英语不好

我必须优化以这种方式编写的脚本

1)检索数据的proc sql

proc sql;
Create table table2 as 
Select A.Id
       ,A.UsefulData1
       ,B.UsefulData2
       ,...
       ,B.UsefulDataN

FROM Table1 as A

LEFT JOIN TableParam1 AS B
ON  A.KeyA = B.KeyA
AND A.KeyB = B.KeyB

/* here : several left join */

LEFT JOIN TableParam2 AS N
ON  A.KeyA = N.KeyA
AND A.KeyB = N.KeyB
;
quit;

2)然后执行数据步骤,以计算大量数据

data table3;
set table2;
/* here : lot of complex computes depending on useful data of the previous step */
keep id, computedData1, ..., computedDataN
run;
/* then add index on the id for later join */

/* if not debug, delete the proc sql table */

然后,它重复“ proc sql / data step”的相同逻辑,其中新的proc sql使用上一个数据步骤的计算数据。 最后,我有几个“ proc SQL表/数据步骤表”。

它非常清楚和易于理解,但是我发现它效率不高,因为proc sql生成的表只是一个“临时表”,仅对数据步骤有用。因此,我编写了一个临时表,由于它们是大表(> 1000万行),因此在时间上会浪费很多时间

在我看来,最有效的方法是将“ proc sql table”保留在内存中,然后仅输出“ data step table”。我会节省大量的写作时间。

有没有办法做这样的事情?还是您看到另一种最有效的方法?

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

是的,首先想到的与汤姆(Tom)相同-将第一行PROC SQL行更改为create view table2 as,然后至少不要使用中间表的存储。

但是,如果SQL仅合并数据集,则完全没有必要,因为您可以在数据步骤中做到这一点。将set table2替换为merge语句,然后在此处合并所有数据集。

答案 1 :(得分:0)

“复杂计算”的本质是什么?如果它们仅是按行计算,则可以在SQL中对其进行编码。

可以使用数据集选项(在创建表表名或数据表名中)构建索引

proc sql;
  create table want (index=(id/unique)) as
  select …
  , … as complicated_result1
  … 
  , … as complicated_resultN
  from T1
  left join T2 on …
  left join T3 on …
  ...

data want (index=(id/unique));
  merge T1 T2 T3 …;
  by key1 key2 … keyN;
  complicated_result1 = … 
  … 
  complicated_resultN = … 
  …