数据集a:-
cc dob enrolled
1 10-13-1981 10-13-2001
2 10-17-1984 12-15-2004
3 07-20-1957 12-20-2007
4 10-13-1989 12-24-2010
5 10-13-1996 12-28-2013
6 10-14-1996 12-11-1999
7 10-15-1996 12-24-2010
8 10-16-1996 12-24-2010
9 10-17-1996 12-24-2010
10 10-18-1996 12-24-2010
SAS代码:-
proc sql;
select distinct count(*) as cust_enrolled ,year(enrolled) as yr
from a
group by yr
order by cust_enrolled desc;
quit;
结果:-
cust_enrolled yr
5 2010
1 2013
1 2004
1 1999
1 2001
1 2007
我的查询是从该结果中获取第一行。我该如何实现?
[通常,我会使用having
子句来测试诸如freq=max(freq)
的聚合。但是,由于freq
已经是聚合count(*)
,必须在子选择中。
示例:
data have;
input cc dob: mmddyy10. enrolled: mmddyy10.;
format dob enrolled mmddyy10.;
datalines;
1 10-13-1981 10-13-2001
2 10-17-1984 12-15-2004
3 07-20-1957 12-20-2007
4 10-13-1989 12-24-2010
5 10-13-1996 12-28-2013
6 10-14-1996 12-11-1999
7 10-15-1996 12-24-2010
8 10-16-1996 12-24-2010
9 10-17-1996 12-24-2010
10 10-18-1996 12-24-2010
;
proc sql;
create table most_popular_enrollment_year as
select * from
(select count(*) as freq, year(enrolled) as yr_enroll
from have
group by yr_enroll
)
having freq=max(freq)
;
quit;
如果存在多个具有最大注册年数的年份,则查询将返回多行。如果您想要最早的那一年,则需要另一个嵌套。
proc sql;
create table earliest_most_popular as
select * from
(
select * from
(
select count(*) as freq, year(enrolled) as yr_enroll
from have
group by yr_enroll
)
having freq=max(freq)
)
having yr_enroll=min(yr_enroll)
;
quit;
另一种方法是按yr_enroll
排序,并使用Proc SQL选项OUTOBS=1
来抓取第一个
proc sql outobs=1;
create table earliest_most_popular as
select * from
(
select count(*) as freq, year(enrolled) as yr_enroll
from have
group by yr_enroll
)
having freq=max(freq)
order by yr_enroll
;
reset outobs=max;
您可以使用PROC SQL的OUTOBS选项来控制SELECT语句写入输出目标的观察次数。
首先让我们将您的列表转换成实际的数据集。
data have;
input cc dob :mmddyy. enrolled :mmddyy.;
format dob enrolled date9.;
datalines;
1 10-13-1981 10-13-2001
2 10-17-1984 12-15-2004
3 07-20-1957 12-20-2007
4 10-13-1989 12-24-2010
5 10-13-1996 12-28-2013
6 10-14-1996 12-11-1999
7 10-15-1996 12-24-2010
8 10-16-1996 12-24-2010
9 10-17-1996 12-24-2010
10 10-18-1996 12-24-2010
;
现在让我们在OUTOBS设置为1的情况下运行SELECT语句。请确保为它提供一些标准,以便在有最大联系数时决定采取哪个观察。
proc sql outobs=1;
select year(enrolled) as yr
, count(*) as cust_enrolled
from have
group by yr
order by cust_enrolled desc, yr
;
quit;
结果:
cust_
yr enrolled
----------------------
2010 5
您可以在任何地方使用数据集选项。 SQL不保证命令的顺序,因此您通常会希望逻辑比简单的逻辑要复杂得多,但是如果您要使用的是逻辑,那么使用OBS=1
选项是一个不错的选择。
proc sql;
select * from sashelp.class(obs=1);
quit;
如果您除了第一个之外还想要其他东西,请同时使用FIRSTOBS
和OBS
。
proc sql;
select * from sashelp.class(firstobs=10 obs=10);
quit;