【问题标题】:sas sql first obs last obssas sql 第一个 obs 最后一个 obs
【发布时间】:2015-04-04 01:42:34
【问题描述】:

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

首先我是这样对数据进行排序的:

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)。我想要与 startdate 的最小值相对应的 enddate,它不是最小的 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 中更改什么以获得我想要的结果?

【问题讨论】:

    标签: sql sorting filter sas left-join


    【解决方案1】:

    我实际上会为此使用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;
    

    【讨论】:

    • 好的,如果我想要第一门课程和最后一门课程的名称,我也可以使用此代码吗?这不是数字变量。
    • 绝对可以,只需要在minid(startdate(和maxid(startdate()之后的括号中加上变量名,然后在末尾加上想要的变量名即可
    猜你喜欢
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    相关资源
    最近更新 更多