2016-05-03 18 views
1

私はIDを持つデータセットを持っており、各IDは、複数の日付(実際には日時を)持っています。 PROC SQLを使用して最小日時を取得し、最低1年間を追加したいと考えています。私は1つのPROC SQLでこれをすべて実行しようとしていますが、不器用になっており、これを動作させることができません。以下は2つの試みです。アドバイスをいただければ幸いです。SAS PROC SQLは - 分の日付を取得し、追加1年

*** GENERATE RANDOM DATES AFTER JAN 1, 2012 AND CREATE DATE/TIME VARIABLE ***; 
data have ; 
    format date mmddyy10. dt datetime15.; 
    do person_id=100, 200, 300, 400, 500; 
    do i = 1 to 100; 
     jdate = int(1000 * ranuni(123987)); 
     date = mdy(1,1,2012) + jdate; 
     dt = dhms(date, 0,0,0); 
     output; 
    end; 
    end; 
run; 

*** TRY1: THIS DOES NOT WORK - GETS MIN DATE/TIME AND REMERGES WITH EVERY RECORD***; 
proc sql; 
    create table try1 as 
    select min(dt) as index_dt format=datetime15. , 
     (dt + 365*24*60*60) as followup_date format=datetime15. 
    from have 
; 
quit; 


*** TRY2: USE MIN() IN "HAVING" STATEMENT ***; 
*** PROBLEMATIC IF PERSON_ID HAS MIN(DT) OCCUR MULTIPLE TIMES ***; 
proc sql; 
    create table try2 as 
    select person_id, 
     dt as index_dt format=datetime15., 
     (dt + 365*24*60*60) as followup_date format=datetime15. 
    from have 
    group by person_id 
    having dt=min(dt) 
; 
quit; 

答えて

0

これを試してみてください:

proc sql; 
create table try1 as 
select 
min(dt) as index_dt format=datetime15. , 
calculated index_dt + 365*24*60*60 as followup_date format=datetime15. 
from have 
; 
quit; 

ここでは "計算された" キーワードを使用しているトリック。 - 「計算」文は私が必要なものである

proc sql; 
create table try1 as 
select 
min(dt) as index_dt format=datetime15. , 
input(compress(
    put(intnx('YEAR', datepart(calculated index_dt),1,'SAMEDAY'),date9.)||":"|| 
    put(timepart(calculated index_dt),time5.)),datetime15.) as followup_date format=datetime15. 
from have 
; 
quit; 
+0

ありがとう:

また、あなたの代わりにあなたの乗算の上で年間追加するには、次の操作を実行することもできます!もう1年INTNXコードで年間を追加していただきありがとうございます。 – SunnyRJ

0

「select person_id」ではなく「select distinct person_id」を使用してください。これは重複の問題に役立ちます。私はSASが365 * 24 * 3600を年間の正しい秒数として扱っているかどうかはわかりませんので、それも寄与する要因かもしれません。

0

私はあなたが唯一のproc SQLで実行できるとは思いません。

*** GENERATE RANDOM DATES AFTER JAN 1, 2012 AND CREATE DATE/TIME VARIABLE ***; 
data have ; 
format date mmddyy10. dt datetime15.; 
do person_id=100, 200, 300, 400, 500; 
do i = 1 to 100; 
    jdate = int(1000 * ranuni(123987)); 
    date = mdy(1,1,2012) + jdate; 
    dt = dhms(date, 0,0,0); 
    output; 
end; 
end; 
run; 

%macro do_elaboration(ds=); 
/*count how many rows has my table */ 
%let dataset=&ds.; 
%let DSID = %sysfunc(open(&dataset., IS)); 
%let nobs = %sysfunc(attrn(&DSID., NLOBS)); 
%let rc=%sysfunc(close(&DSID.)); 
/*loop over the number of rows*/ 
%do i=1 %to &nobs.; 
    /*at each loop get one id*/ 
    data _NULL_; 
     set &ds. (OBS=&i OBS=&i); 
     call symputx("id", person_id); 
    run; 
    /*with proc sql get the min_dt*/ 
    proc sql noprint; 
     select min(dt) into:min_dt 
     from &ds. 
     where person_id=&id. 
    ; 
    quit; 
    /*increment the min_dt with the function sas intnx*/ 
    data have_final_tmp; 
     person_id = &id.; 
     followup_date = intnx('dtyear',&min_dt,1); 
     format followup_date datetime15.; 
    run; 
    /*put all id with the followup_date in only one dataset*/ 
    proc append base=have_final data=have_final_tmp force; 
    run; 
%end; 
%mend do_elaboration; 
/*call the macro*/ 
%do_elaboration(ds=have); 

私は非常に迅速にコードを書いて、あなたはそれを確認する必要がありますので、私はそれをテストしませんが、コンセプトが明確である:私はこの方法でそれを行うと思います。

関連する問題