我是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;
答案 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。