首页 > 解决方案 > 有没有更好的方法在 PROC SQL 中使用嵌套函数?

问题描述

我正在做一些需要不止一次查询的事情,proc sql所以我尝试编写代码来执行类似于嵌套函数的data step. 这是一个示例:数据测试有 2 个变量,Group 和 Num。

data test;
  input Group$ Num;
  cards;
  A 10
  A 30
  B 10
  B 40
  C 30
  C 30
  ;
run;

现在我正在寻找Group具有最大平均值的那个。所以首先我计算每个 的平均值Group,然后得到这些平均值的最大值,最后选择Group其平均值与步骤 2 中的结果值相同的那个。

proc sql;
  select Group, avg(Num) as Mean
  from test
  group by Group
  having Mean = (
    select max(mean) from (
      select avg(Num) as mean from test group by Group
    ) 
  )
  ;
quit;

是的,我得到了正确答案,它是“C”。但是我不喜欢这种方法,太冗长了。以下代码语法错误:

proc sql;
  select Group, avg(Num) as Mean
  from test
  group by Group
  having Mean = max(avg(Num))
  ;
quit;

但它更漂亮,也更短。你有没有更好的方法来做到这一点?

标签: functionsasproc-sql

解决方案


您可以利用 SQLoutobs=选项,利用降序排序。

proc sql outobs=1;
  select group, mean(num) as num_mean 
  from test
  group by group
  order by num_mean desc
  ;

having带有聚合函数 ( )的 SAS SQL子句max将执行自动重新合并。

proc sql;
  select Group, num_mean
  from 
    (
      select group, mean(num) as num_mean 
      from test group by group
    )
  having 
    num_mean = max(num_mean)
  ;

推荐阅读