基本SQL(在SAS中编译) - 按频率检索前10个条目

时间:2015-07-03 19:19:50

标签: sql sas proc-sql

我是SQL新手并试图运行这段代码来计算每个条目的频率,但我收到了错误(并且无法弄清楚原因 - 在这种环境中没有真正的调试,只是" ERROR 22-322:语法错误,期望以下之一:;,',',USING。& ERROR 202-322:选项或参数无法识别,将被忽略。")。

顺便说一下,我在SAS Enterprise Guide 6.1中进行了编译。任何帮助将非常感激!

proc sql;
create view work.temp as 
select model_name, count(*) as frequency
from mytable_name
where model_type like '%Smartphones%'
and model_name not like '%Apple iPhone 5%'
group by model_name
order by count(*) desc 
limit 10;   
quit; 

2 个答案:

答案 0 :(得分:1)

limit 10不是SAS proc sql中的有效代码。通常,在SAS PROC SQL中没有一种限制对输出的观察的好方法;由于某种原因,(obs=10)无法作为数据集选项。

你也不能order by count(*);您只能按创建的列进行订购。

所以你可以这样做:

proc sql;
  create view work.temp as 
    select model, count(*) as frequency
      from sashelp.cars
      group by model
      order by 2  desc 
;
quit; 

2指的是第二列(因此,频率列)。

如果您想限制较少数量的观察,您可以在实际使用视图的地方使用(obs=#),在某些情况下(但不在其他情况下) - 一般情况下,我认为它不适用于在大多数地方使用PROC SQL。

一般来说,这个特定的查询在基础SAS而不是SQL中可能更容易,特别是如果你想限制它的输出。

proc freq data=sashelp.cars order=freq noprint;
  where origin='Asia';
  tables make/out=makelist(where=(count>10) keep=make count);
run;

这将比SQL快一点(假设你没有从视图中获得任何东西,anwyay;如果你只输出几行视图对你没什么帮助)。当然,我在这里限制一个特定的计数,而不是一个特定的障碍物,但它大致相同。

要完成标题的问题,您可以简单地从该数据集中选择前10个条目(假设您要求PROC FREQ返回按频率排序的数据集,如上所述):

data topten;
  set makelist;
  if _n_ le 10;  *first 10 iterations;
run;

或使用proc rank或任意数量的选项。

答案 1 :(得分:1)

您可以使用PROC SQL的OUTOBS=选项来限制观察。

proc sql outobs= 10;
    create view work.temp as 
    select model_name, count(*) as frequency
    from mytable_name
    where model_type like '%Smartphones%'
    and model_name not like '%Apple iPhone 5%'
    group by model_name
    order by count(*) desc;   
quit; 

如果您尝试使用一些示例代码在SAS中学习SQL,那么我建议您浏览这些examples from SAS