SAS: представление шага данных -> ошибка: переменная не отсортирована должным образом - PullRequest
0 голосов
/ 29 апреля 2018

Я использую макрос для циклического обхода файлов на основе имен и извлечения данных, который отлично работает в большинстве случаев, однако время от времени я сталкиваюсь с

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

где CQM_20141113 - файл, из которого я извлекаю данные. Фактически мой макрос проходит через CQ.CQM_2014: и работает до 2014 года. Из-за этой единственной ошибки файл не создается.

Я использую представление шага данных, чтобы «инициализировать» данные, а затем на следующем шаге вызвать представление шага данных (пример кода с сокращенными условиями где):

%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;

Когда я вижу ошибку в файле журнала и снова запускаю файл, он работает (иногда мне нужно несколько попыток).

Я думал о сортировке процедур, но как это сделать при использовании пошагового просмотра данных? Обратите внимание, что cqm-файлы очень большие (что также может быть причиной проблемы).

edit: taq_ds - это не один файл, а несколько файлов, имена которых начинаются с CQM_2014, т. Е. CQM_20140101, CQM_20140102 и т. Д.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Создание индекса на taq_ds, соответствующего порядку группы by, также решит эту проблему, например ::100100

proc datasets lib=<library containing taq_ds>;
modify taq_ds;
index create index1=(sym_root date time_m);
run;
quit;
0 голосов
/ 29 апреля 2018

Исходя из предоставленного кода, вы можете заменить свой первый шаг просмотра данных на SQL:

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

В качестве альтернативы вы можете добавить к вашему шагу данных аналогичное представление. Это обеспечило бы порядок, необходимый для последующего оператора by.

...