Получить значение за n дней до каждой даты - PullRequest
2 голосов
/ 13 января 2011

У меня есть следующий набор данных, и мне нужно получить две вещи: 1) сумму VALUE между (date-1) и (date-3) для каждой даты и 2) есть ли в течение 5 дней > = два дня, когда ЗНАЧЕНИЕ равно 0. Я думаю, что нужно использовать PROC SQL, но я не уверен, как это реализовать. ВХОДНЫЕ ДАННЫЕ:

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) 1 (0 + 0 + 1) для ID1, 20110104 и 6 (1 + 2 + 3) для ID2, 20110104. и 2) отметка для ID1, 20110104, так как есть 2 дня с значение 0 в течение 3-дневного окна.

Любая помощь очень ценится!

Ответы [ 2 ]

2 голосов
/ 13 января 2011

Обе проблемы могут быть решены с помощью одного и того же 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 голос
/ 14 января 2011

Вот альтернативный способ, который просто использует шаг данных.Я предполагаю, что вам не нужны суммы и отметки для диапазонов менее трех записей, поэтому шаг данных явно устанавливает их как неопределенные.

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;
...