[英]How can I loop multiple datasets through a data step or proc sql query 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;
如果您想要第一個以外的東西,請一起使用FIRSTOBS
和OBS
。
proc sql;
select * from sashelp.class(firstobs=10 obs=10);
quit;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.