全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
4462 3
2017-04-22
请教大家:proc sql中,容易求max和min,但是第二大,第三大怎么表述?

proc sql;
  create table tem as
   select distinct *, max(score) as max_score,
from data
    group by class,student;
quit;


但是,我这里不仅仅想要全班最高分,还需要第二名,第三名的分数。应该怎么写呢?



二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2017-4-22 21:15:50
sql还真没有想到方法,排个序取前几条观测倒是可以… 还有univariate过程可以输出极端值,也可以输出最大的几个和最小的几个
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2017-4-22 21:54:24
Strive、 发表于 2017-4-22 21:15
sql还真没有想到方法,排个序取前几条观测倒是可以… 还有univariate过程可以输出极端值,也可以输出最大的 ...
univariate过程,可能还需要自己手工从输出窗口去提取,比较麻烦。排序倒是可以!如果要是能有个函数就更好了!非常感谢您!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2017-4-23 10:45:57
SAS官方论坛上看到的:

data have;
input id $ score @@;
datalines;  /*临时弄几个分数测试*/
S12 -20 S12  20 S12  10
S12  10 S12  20 S12 -50
S13 -40 S13  60 S13 -100
S14  10 S14  20 S14  0
S14 -30 S14 -20
;

/* change as needed to bring back desired ranking  */
%let start= 1;
%let end = 3;

/*  create table containing distinct id and value  -- needed b/c more than one id can have the same score */
proc sql;
create table dst_id_score as
select distinct id, score from have
order by id, score desc;  /* keep this sort order for ranking */
* NOTE: Table WORK.DST_ID_SCORE created, with 12 rows and 2 columns. ;

/*  assign ranking by id by score */
data temp;
set dst_id_score ;
by id;
if first.id then rnk=0;
rnk + 1;
run;
* NOTE: The data set WORK.TEMP has 12 observations and 3 variables. ;

/*  go back to original file and bring back all data meeting desired ranking  */
proc sql;
create table final_top_ranked as
select
  a.id
, a.score
, b.rnk as rank
from have a inner join temp b on a.id = b.id and a.score = b.score
where rnk between &start and &end
order by id, rnk;
* NOTE: Table WORK.FINAL_TOP_RANKED created, with 11 rows and 3 columns. ;

这一段里只要调start和end,那么不止前三名,原则上可以查询任何范围内的数据。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群