sas sql第一个obs最后一个obs



我有一个数据集,其中有关于一个人所学所有课程的信息。我对他们开始的第一门课程的信息感兴趣(开始日期和结束日期),以及他们开始的最后一门课程的开始和结束日期。课程可能重叠,每个人可能有大量的课程。我想编辑数据,这样一个人就是一个观察。

首先,我对数据进行了如下排序:

by personid startdate descending enddate;

我试过这个:

proc sql;
create table new as
select distinct personid, 
count(*) as number_courses, 
min(startdate) as first_startdate 'First startdate' format date9., min    (enddate) as first_enddate 'First enddate' format date9.,
max(startdate) as last_startdate 'Last startdate' format date9., max(enddate) as last_enddate 'Last enddate'  format date9.
from old
group by personid
;
quit;

但这并没有给我想要的。通常是min(结束日期)是错误的。我想要与起始日期的最小值相对应的结束日期,但它不一定是最小结束日期。

取而代之的是,我写道:

data first last;
set old;
by personid startdate descending enddate;
if first.personid then output first;
if last.personid then output last;
keep personid startdate enddate ;
run;

这给了我想要的东西。然后,我不得不重命名变量,并通过personid最后一次加入数据集。但我觉得这种方法不是最优的。

所以我的问题是,我应该在proc-sql中更改什么才能得到我想要的结果?

我实际上会使用PROC SUMMARY(与带有NOPRINT选项的PROC MEANS相同)。您可以利用MINIDMAXID函数来满足您的需要。在代码中,MINID说"给我起始日期和与最早起始日期相关的结束日期",MAXID显然给出了与最新起始日期相关的值

data have; /* sample data */
input personid startdate :date9. enddate :date9.;
format startdate enddate date9.;
datalines;
1   01jan2014 01mar2014
1   25feb2014 01jun2014
1   03mar2014 25may2014
2   01may2014 01sep2014
2   02sep2014 01oct2014
2   01nov2014 01dec2014
;
run;
proc summary data=have nway;
class personid;
output out=want (drop=_:)
    n(personid) = number_courses 
    minid(startdate(startdate enddate))=first_startdate first_enddate
    maxid(startdate(startdate enddate))=last_startdate last_enddate;
run;

相关内容

最新更新