【问题标题】:Basic SQL (compile in SAS) - retrieve top 10 entries by frequency基本 SQL(在 SAS 中编译) - 按频率检索前 10 个条目
【发布时间】:2025-11-21 13:05:01
【问题描述】:

我是 SQL 新手,我试图运行这段代码来计算每个条目的频率,但我遇到了一个错误(并且不知道为什么 - 在这个环境中没有真正的调试, 只是“错误 22-322:语法错误,期待以下之一:;, ',', USING。& 错误 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; 

【问题讨论】:

  • 您使用proc sql是因为您想学习它,还是出于其他原因?
  • 我刚刚开始,每个人都在这里使用它——他们都只是在 SAS 中编译 SQL 代码。我正在努力学习它。
  • 快速学习:每个 SQL 编译器都不同。 Oracle、SQL Server、mySQL、SAS 等都有不同的实现,它们基本相同,但在边缘有显着差异。
  • 另外 - 您的 SAS 版本(如果您有 EG 6.1,可能是 9.4)比您的 Enterprise Guide 版本更重要。 EG 只是您的 IDE,它与后端的实际工作没有任何关系。
  • 最后——如果你使用的是 SAS,至少要学一点普通的 SAS。使用内置程序,您在上面所做的很多事情都会变得更容易和更快。对于这种事情,PROC FREQPROC MEANS 几乎可以保证比 PROC SQL 快,因为它们针对它们正在做的事情进行了优化。

标签: sql sas proc-sql


【解决方案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;如果您只输出几行视图不会对您有太大帮助)。当然,这里我限制的是特定的计数而不是特定的 obs,但它几乎是一样的。

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】: