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
相同)。您可以利用 MINID
和 MAXID
函数来满足您的需求。在代码中,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;
我有一个数据集,其中包含有关一个人参加的所有课程的信息。我对他们开始的第一门课程的信息(开始日期和结束日期)以及他们开始的最后一门课程的开始和结束日期感兴趣。课程可以重叠,每个人可以有大量的课程。 我想编辑数据,使一个人是一个观察值。
首先我将数据排序如下:
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
相同)。您可以利用 MINID
和 MAXID
函数来满足您的需求。在代码中,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;