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

Basic SQL (compile in SAS) - retrieve top 10 entries by frequency

我是 SQL 的新手,正在尝试 运行 这段代码来计算每个条目的频率,但我遇到了一个错误(并且无法找出原因——在这个环境中没有真正的调试,只是 "ERROR 22-322: Syntax error, expecting one of the following: ;, ',', USING. & ERROR 202-322: The option or parameter is not recognized and will be ignored.")。

顺便说一下,我正在使用 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; 

limit 10 在 SAS proc sql 中不是有效代码。一般来说,在 SAS PROC SQL 中没有限制对 output 的观察的好方法; (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 中有效。

一般来说,这个特定的查询在 base 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 快一点(假设您没有从视图中获得任何东西,无论如何;如果您只输出几行视图将不会帮助您很多)。当然,这里我限制的是特定的计数,而不是特定的 obs 数量,但大同小异。

为了完成标题的问题,您可以简单地 select 该数据集中的前 10 个条目(假设您像我一样询问 PROC FREQ 到 return 按频率排序的数据集以上):

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

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

您可以使用 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