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

时间:2011-01-13 09:49:30

标签: sas

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

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 

输出应为1)ID1,20110104为1(0 + 0 + 1),ID2,2010104为6(1 + 2 + 3).2)ID1,20110104的标记,因为有2天与在3天窗口期间值为0。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

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

1)

proc sql;
 select t1.id, t1.date, sum(t2.value) as totalvalue
 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
 group by t1.id, t1.date;
quit;

2)

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;

答案 1 :(得分:1)

这是一种仅使用数据步骤的替代方法。我假设你不想要少于三个记录范围的总和和标记,所以数据步骤明确地将它们设置为未定义。

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;