Sas 检索每个日期前n天的值

Sas 检索每个日期前n天的值,sas,Sas,我有一个如下的数据集,我需要检索两件事:1)每个日期(date-1)和(date-3)之间的值之和,2)在5天内,是否有>=两天的值为0。我认为应该使用procsql,但我不确定如何实现这一点。 输入数据集: ID DATE VALUE 1 20110101 0 1 20110102 0 1 20110103 1 1 20110104 2 2 20110101 1 2 20110102 2 2 201101

我有一个如下的数据集,我需要检索两件事:1)每个日期(date-1)和(date-3)之间的值之和,2)在5天内,是否有>=两天的值为0。我认为应该使用procsql,但我不确定如何实现这一点。 输入数据集:

ID   DATE      VALUE
1   20110101     0
1   20110102     0
1   20110103     1
1   20110104     2
2   20110101     1
2   20110102     2
2   20110103     3
2   20110104     4 
对于ID12010104,输出应为1)1(0+0+1),对于ID22010104,输出应为6(1+2+3)。和2)ID1的标记,20110104,因为在3天窗口期间有2天的值为0


非常感谢您的帮助

这两个问题都可以用类似的SQL查询来解决。你的第二个问题有点让人困惑,因为你曾经提到过一个5天的周期和一个3天的窗口。我对两个查询使用了相同的3天窗口,因此如果需要其他窗口,请修改开始和结束日期

(一)

(二)


这里有一种仅使用数据步骤的替代方法。我假设您不需要小于三条记录的范围的总和和标记,因此数据步骤显式地将它们设置为未定义

proc sort data=sample;
    by id date;
run;

data result(drop=k count);
    retain count;
    set sample;
    by id;

    if first.id then count=0;
    sum=lag1(value) + lag2(value) + lag3(value);
    if count<3 then sum=.;

    k=0;
    if lag1(value)=0 then k=k+1;
    if lag2(value)=0 then k=k+1;
    if lag3(value)=0 then k=k+1;
    if k ge 2 then mark=1;

    count=count+1;

run;

proc print data=result;
run;
proc sort data=sample;
按身份证日期;
跑
数据结果(下降=k计数);
保留计数;
设定样本;
按身份证;
如果first.id,则count=0;
总和=lag1(值)+lag2(值)+lag3(值);

如果我不喜欢滞后函数的话。我发现使用它风险太大,因为它很难排除bug(例如,如果您在if语句中意外使用它)。就我个人而言,我坚持使用retain语句并手动执行。我发现这更容易排除故障。
proc sql;
 select t1.id, t1.date
 from _input t1
 left join _input t2
 on t1.date-4 lt t2.date
 and t1.date gt t2.date
 and t1.id = t2.id
 and t2.value = 0
 group by t1.id, t1.date
 having count(*) ge 2
;
quit;
proc sort data=sample;
    by id date;
run;

data result(drop=k count);
    retain count;
    set sample;
    by id;

    if first.id then count=0;
    sum=lag1(value) + lag2(value) + lag3(value);
    if count<3 then sum=.;

    k=0;
    if lag1(value)=0 then k=k+1;
    if lag2(value)=0 then k=k+1;
    if lag3(value)=0 then k=k+1;
    if k ge 2 then mark=1;

    count=count+1;

run;

proc print data=result;
run;