SAS: представление шага данных -> ошибка: неправильная сортировка по переменной

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

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;

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

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

редактировать: taq_ds не является одним файлом, а проходит через несколько файлов, имя которых начинается с CQM_2014, т. е. CQM_20140101, CQM_20140102 и т. д.


person eternity1    schedule 29.04.2018    source источник
comment
Вы можете индексировать &taq_ds. на sym_root date time_m или создайте представление sql с предложением order by.   -  person Richard    schedule 30.04.2018


Ответы (2)


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

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

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

person Allan Bowe    schedule 29.04.2018
comment
спасибо @Allan Bowe: кое-что, что пришло мне в голову: возможно ли как-то интегрировать часть кода, которая говорит, что если вы столкнетесь с ошибкой заказа (или, может быть, даже с любой другой ошибкой), пропустите файл и перейдите к следующему ? - person eternity1; 30.04.2018
comment
извините, нужно было добавить, как я определяю свои переменные: %let taq_ds = cq.cqm_2013:;, где я использовал свойство SAS для перебора всех файлов с именем cqm_2013mmdd. Что мне нужно настроить в инструкции proc sql? - person eternity1; 30.04.2018
comment
да — вы можете добавить условие, такое как %if &syscc ge 4 %then %do;, и реализовать логику, позволяющую продолжить обработку (например, options obs=max) - person Allan Bowe; 30.04.2018
comment
ref ваш второй комментарий - это не очень понятно. Может быть, вы могли бы задать новый вопрос? - person Allan Bowe; 30.04.2018
comment
спасибо @Allan Bowe: я пытался обернуть это в оператор proc sql, однако у меня есть проблема, что &taq_ds - это не один файл / таблица, а похоже на цикл, проходящий через несколько таблиц; так taq_ds = cq.cqm_2013:;а там типа cq.cqm_20130101, cq.cqm_20130102 по одному файлу на каждый день; Я подозреваю, что это невозможно в рамках proc sql. по другому вопросу я создам новый - person eternity1; 30.04.2018
comment
новый вопрос здесь: stackoverflow.com/questions/50106168/ - person eternity1; 30.04.2018

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

proc datasets lib=<library containing taq_ds>;
modify taq_ds;
index create index1=(sym_root date time_m);
run;
quit;
person user667489    schedule 30.04.2018
comment
будет ли это работать, если мой taq_ds - это не один файл, а цикл по нескольким файлам? - person eternity1; 30.04.2018
comment
Вы можете сделать что-то подобное, проиндексировав каждый из базовых наборов данных. Пожалуйста, обновите свой вопрос с более подробной информацией. - person user667489; 30.04.2018