基本 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。
我是 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。