簡體   English   中英

如何使用 proc sql 從 sas 中的以下數據中獲取第一行

[英]How can I get the top row out of the following data in sas using proc sql

數據集 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 語句寫入 output 目標的觀測數。

首先,讓我們將您的列表轉換為實際的數據集。

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;

如果您想要第一個以外的東西,請一起使用FIRSTOBSOBS

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM