sas sql 第一个 obs 最后一个 obs

sas sql first obs last 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(enddate)。我想要与开始日期的最小值相对应的结束日期,它不是最小结束日期。

相反,我写道:

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 表示 'give me the startdate and endate associated with the earliest startdate',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;