Sas 如何找到一列的两个最大值

Sas 如何找到一列的两个最大值,sas,proc-sql,Sas,Proc Sql,我在SAS中有一个表,我试图找到给定列的最大值和第二个最大值 例如: Id Column 1 100 2 50000 3 50 4 4000 5 97 6 7000 我的代码需要找到以下内容: Id Column 2 50000 6 7000 在proc-sql(甚至在SAS语言中)中有什么方法可以做到这一点吗?假设没有关系,按降序对表进行排序,然后取前2个值 proc sort data=have out=temp; by descending column; run

我在SAS中有一个表,我试图找到给定列的最大值和第二个最大值

例如:

Id Column
1  100
2  50000
3  50 
4  4000
5  97
6  7000
我的代码需要找到以下内容:

Id Column
2   50000
6   7000

proc-sql
(甚至在SAS语言中)中有什么方法可以做到这一点吗?

假设没有关系,按降序对表进行排序,然后取前2个值

proc sort data=have out=temp;
by descending column;
run;

data want;
set temp(obs=2);
run;
如果您有关联并且只需要不同的值,请尝试PROC SORT上的
nodupkey
选项:

proc sort data=have out=temp nodupkey;
by descending column;
run;

data want;
set temp(obs=2);
run;

PROC UNIVARIATE
将为您执行此操作,如中所述:

查看
极端观测值表

如果要将其放入数据集中,只需使用
extremeobs
输出对象:

ods output extremeobs=extremes;
proc univariate data=sashelp.class;
  var height;
  id name;
run;
ods output close;

然后过滤到
变量以及第4次和第5次观察。这与几乎任何其他解决方案的关系都有同样的问题。

另一个选项:
PROC意味着使用
IDGROUP
。这将获得一个水平/宽数据集,但您可以使用
PROC transpose
或数据步骤以任何方式对其进行转置。有关更多详细信息,请参阅本文

proc means data=sashelp.class;
  var height;
  output out=classout idgroup(max(height) out[2]  (height name)=height name) /autoname;
run;

为了完整起见,这里有一个
procsql
解决方案。不一定比其他任何一个都好,也不能处理关系

data have;
input Id Column;
datalines;
1  100
2  50000
3  50 
4  4000
5  97
6  7000
;
run;

proc sql outobs=2;
create table want as
select * from have
order by column desc;
quit;
最后,一个使用
proc-rank
的解决方案,该解决方案确实包括领带

data have;
input Id Column;
datalines;
1  100
2  50000
3  50000 
4  4000
5  97
6  7000
;
run;

proc rank data=have out=want_ties (where=(column_rank<=2)) descending ties=dense;
var column;
ranks column_rank;
run;
数据已经存在;
输入Id列;
数据线;
1  100
2  50000
3  50000 
4  4000
5  97
6  7000
;
跑

proc-rank data=have out=want\ties(其中=(column\u-rank这里有一个不同的
proc-sql
选项-这个选项选择两个最高的不同值,以及所有具有这些值的ID。它有点复杂,并且只起作用,因为SAS在处理摘要统计信息方面很好

proc sql;
  select age, name
    from sashelp.class
    where age =
      (select max(age) from sashelp.class)
      or age = 
      (select max(age) from 
       (select case when age=max(age) then . else age end as age from sashelp.class)
      )
    ;
quit;

如果有领带呢?
proc sql;
  select age, name
    from sashelp.class
    where age =
      (select max(age) from sashelp.class)
      or age = 
      (select max(age) from 
       (select case when age=max(age) then . else age end as age from sashelp.class)
      )
    ;
quit;