首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sas sql first obs最后一次obs

sas sql first obs最后一次obs
EN

Stack Overflow用户
提问于 2015-02-04 13:47:19
回答 1查看 793关注 0票数 2

我有一个数据集,其中有关于一个人上过的课程的信息。我感兴趣的信息,他们开始的第一个课程(开始日期和结束日期),也开始和结束日期的最后一个课程开始。课程可以重叠,每个人都可以有大量的课程。我想编辑数据,使一个人是一个观察。

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

代码语言:javascript
复制
by personid startdate descending enddate;

我试过这个:

代码语言:javascript
复制
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(结束日期)。我想要与开始日期的最小值相对应的结束日期,并且它不是任意的最小结束日期。

相反,我写道:

代码语言:javascript
复制
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中修改什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-04 14:21:52

实际上,我将为此使用PROC SUMMARY (与PROC MEANSNOPRINT选项相同)。您可以利用MINIDMAXID函数来满足您的需要。在代码中,MINID说‘给我与最早开始日期相关联的开始日期和结束日期’,MAXID显然给出了与最近开始日期相关联的值

代码语言:javascript
复制
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;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28323009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档