Вместо двойного цикла и множественных сравнений я предлагаю реструктуризацию, которая позволяет сортировать и сравнивать только последовательные тесты.
Сначала я создаю небольшие поддельные данные для демонстрации на:
data list free/PersonNo (f6) date1(Date11) score1(f3) Date2(date11) score2 (f3) Date3 (date11) score3(f3) Date4 (date11) score4(f3).
begin data
98432, 09-Feb-18, 74, 06-Nov-18, 76, 10-Aug-18, 67, ,
91203, 10-Dec-18, 75, 10-Sep-18, 65, , , ,
75432, 01-Jan-18, 65, 01-Dec-18, 65, , , ,
12345, 19-Mar-18, 74, 26-Dec-19, 55, 10-Aug-18, 81, 19-Feb-19, 77
end data.
Теперь для актуальной задачи:
* first step - restructuring to long format.
varstocases /make date from date1 date2 date3 date4/make score from score1 score2 score3 score4.
* now it is possible to sort by test date, compare the dates and keep only the relevant ones.
sort cases by PersonNo date.
if $casenum>1 and PersonNo=lag(PersonNo) cond=DATEDIFF(date, lag(date), 'days') < 182.
create cond2=lead(cond,1).
select if cond or cond2.
exe.
* At this point you have only the relevant persons and tests left.
You might continue your analysis in this structure,
but if you want the following code gets you back to the original structure.
compute ind=1.
if $casenum>1 and PersonNo=lag(PersonNo) ind=lag(ind)+1.
format ind(f1).
casestovars /id=PersonNo /index=ind /drop cond cond2 /groupby=index /separator="".