Sql 自动使用SAS滞后功能/滞后循环的方法?

Sql 自动使用SAS滞后功能/滞后循环的方法?,sql,loops,sas,lag,Sql,Loops,Sas,Lag,我有一个数据集,2年内每周一行(共104行)。我有一个每周为1或0的标志列。我想用以下逻辑创建一个新列: 如果该周的标志=1,则该周和随后3周的标志为1 我目前有效的方法是: if flag=1 or lag(flag)=1 or lag2(flag)=1 or lag3(flag)=1 then flag_new=1; 虽然这是可行的,但如果我希望flag_new在接下来的20或30周内为1,而不是仅为3周,这将变得非常乏味 我希望有一个更简单的方法来做这件事(也许是一个循环?),但我不太熟

我有一个数据集,2年内每周一行(共104行)。我有一个每周为1或0的标志列。我想用以下逻辑创建一个新列:

如果该周的标志=1,则该周和随后3周的标志为1

我目前有效的方法是:

if flag=1 or lag(flag)=1 or lag2(flag)=1 or lag3(flag)=1 then flag_new=1;
虽然这是可行的,但如果我希望flag_new在接下来的20或30周内为1,而不是仅为3周,这将变得非常乏味

我希望有一个更简单的方法来做这件事(也许是一个循环?),但我不太熟悉它


非常感谢您的帮助

与其回顾过去,不如把它看作是向前看。也就是说,每次看到flag=1时,为该记录和接下来的三条记录设置flag_new=1。类似于(未经测试):


您还可以使用临时数组来保留滞后信息,然后捕获数组中的最高值。如果是1,那么您也可以将新标志设置为1。要更改尺寸,只需将2更改为所需的n-1即可

这还演示了BY语句,并在新组开始时重置它

data want;

 array p{0:2} _temporary_;

 set have;
 by object;

if first.object then call missing(of p{*});
p{mod(_n_,4)} = flag;
highest = max(of p{*});

if highest > 1 then do;
    flag_new = 1;
end;
run;
data want;

 array p{0:2} _temporary_;

 set have;
 by object;

if first.object then call missing(of p{*});
p{mod(_n_,4)} = flag;
highest = max(of p{*});

if highest > 1 then do;
    flag_new = 1;
end;
run;