如何使用proc sql在sas中从以下数据中获得第一行

问题描述 投票:0回答:3

数据集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 

我的查询是从该结果中获取第一行。我该如何实现?

sas proc-sql
3个回答
0
投票

[通常,我会使用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;

0
投票

您可以使用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

0
投票

您可以在任何地方使用数据集选项。 SQL不保证命令的顺序,因此您通常会希望逻辑比简单的逻辑要复杂得多,但是如果您要使用的是逻辑,那么使用OBS=1选项是一个不错的选择。

proc sql;
select * from sashelp.class(obs=1);
quit;

如果您除了第一个之外还想要其他东西,请同时使用FIRSTOBSOBS

proc sql;
select * from sashelp.class(firstobs=10 obs=10);
quit;
© www.soinside.com 2019 - 2024. All rights reserved.