1

我正在使用宏来循环基于名称的文件并提取数据,这在大多数情况下都可以正常工作,但是我有时会遇到

ERROR: BY variables are not properly sorted on data set CQ.CQM_20141113.

其中 CQM_20141113 是我从中提取数据的文件。事实上,我的宏循环CQ.CQM_2014:运行,直到 20141113 为止。由于这个单一的失败,然后没有创建文件。

我正在使用数据步骤视图来“初始化”数据,然后在进一步的步骤中调用数据步骤视图(缩短 where 条件的代码示例):

%let taq_ds = CQ.CQM_2014:;

data _v_&tables / view=_v_&tables;
     set &taq_ds;
     by sym_root date time_m; *<= added by statement
     format sym_root date time_m;
     where sym_root = &stock;   
run; 

data xtemp2_&stockfiname (keep = sym_root year date iprice);
     retain sym_root year date iprice; 
     set _v_&tables; 
     by sym_root date time_m;

/* some conditions */
run;

当我通过日志文件看到错误并再次运行该文件时,它就可以工作了(有时我需要一些试验)。

我在考虑 proc 排序,但是在使用数据步骤视图时如何做到这一点?请注意 cqm 文件非常大(这也可能是问题的根源)。

编辑:taq_ds不是单个文件,而是贯穿多个名称以 开头的文件CQM_2014,即 CQM_20140101、CQM_20140102 等。

4

2 回答 2

4

根据提供的代码,您可以用 SQL 替换您的第一个数据步骤视图:

proc sql;
create view _v_&tables as
  select * from &taq_ds
  where sym_root = &stock
  order by sym_root, date, time_m;

或者,您可以在数据步骤视图前面加上类似的视图。by这将强制执行后续语句所需的排序。

于 2018-04-29T20:48:32.127 回答
1

创建与组顺序taq_ds相对应的索引by也可以解决此问题,例如:

proc datasets lib=<library containing taq_ds>;
modify taq_ds;
index create index1=(sym_root date time_m);
run;
quit;
于 2018-04-30T07:28:05.593 回答