Ok, это обновленный ответ, он требует некоторое понимание SQL на определенном уровне, оно работает, если ваш объем данных не слишком велик. Обратите внимание, что я преобразовал термин в число во входящем наборе данных, но его также можно выполнить «на лету». Если вы чувствуете, что он работает слишком медленно, я предлагаю: 1. Прибегать к вашим данным, уменьшая срок в пределах id, 2. DOW или Hash должно быть достаточно.
data have;
input id term (course1 course2 ) (:$8.);
cards;
21 201010 MAT 41
21 201010 MAT 51
21 201020 MAT 51
21 201020 SPC 13
29 201120 pos 94
29 201130 pos 94
;
PROC SQL;
CREATE TABLE WANT AS
SELECT *, CASE WHEN EXISTS(SELECT * FROM HAVE WHERE ID=A.ID AND
(INT(TERM/100) = INT(A.TERM/100) AND MOD(TERM,100)=MOD(A.TERM,100)+10
OR INT(TERM/100) = INT(A.TERM/100)+1 AND MOD(TERM,100)=MOD(A.TERM,100)-20)
AND CATS(A.COURSE1,A.COURSE2) = CATS(COURSE1,COURSE2))
THEN 'Yes' ELSE 'No' END AS NEXTTERM
FROM HAVE A;
QUIT;
Это лучшее решение. Он устанавливает объект Hash в первом DOW для хранения всего термина, информации о курсе в пределах одного идентификатора, а затем во втором DOW, чтобы проверить, соответствует ли ваше состояние. Это не требует сортировки, если все идентификаторы остаются вместе (сгруппированы). Подробнее см. В документах SAS Hash.
data have;
input (id term course1 course2) (:$8.);
cards;
21 201010 MAT 41
21 201010 MAT 51
21 201020 SPC 13
21 201030 MAT 51
21 201030 SPC 13
29 201120 pos 94
29 201130 pos 94
;
run;
data want;
if _n_=1 then do;
dcl hash h();
h.definekey('term','course1','course2');
h.definedone();
end;
do until (last.id);
set have;
by id notsorted;
rc=h.add();
end;
length nextterm $3;
do until (last.id);
set have;
by id notsorted;
if h.check(key:cats(substr(term,1,4),input(substr(term,5),2.)+10),key:course1, key:course2) = 0 or
h.check(key:cats(input(substr(term,1,4),4.)+1,input(substr(term,5),2.)-20),key:course1, key:course2) =0 then
nextterm='Yes';
else nextterm = 'No';
output;
end;
h.clear();
run;
Это в основном верно , Но, возможно, я не упомянул прав. Термин «линия» похож на 201120-201130-201210. Когда данные переходят с 201130 по 2012 год10, это не показывает это? Как я могу это показать? Спасибо за ответ. Я не знал его опережающую технику, не смог найти имя для вызова. – joys
Мои извинения. Я не читал это правильно, но затем он приносит с моей стороны больше вопросов: 1. Как построены ваши термины? это всегда 4 цифры года плюс число увеличилось на 10? таких как 201120-201130, и сколько терминов у вас есть каждый год? 2. Как выглядят ваши данные. У вас есть время от времени 201110, переходя к 201130 году, то есть студент пропускает весь термин? И если это произойдет, вы считаете, что 201130 станет следующим термином 201110? Ответы на эти вопросы имеют решающее значение для определения подходов к программированию. –
Каждый год имеет 3 условия. год + 10 или 20 или 30. Итак, следующим образом, 201010- 201020-201030-201110-201120-201130-201210-201220 -, .... так далее. Все условия таковы. Нет прыжков, 201110, то 201120 – joys