You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PROC SQL的OVER与PARTITION BY报错,求同年龄身高均值解决方法

问题:PROC SQL中OVER(PARTITION BY)窗口函数语法错误的解决

尝试用PROC SQL的OVER(PARTITION BY age)子句计算同年龄受试者的平均身高,提交代码后出现语法错误,已知GROUP BY用法,寻求窗口函数报错的解决方案。

提交的SAS代码

proc sql ;
  create table case1 as select 
                         Name, age, height , 
                      AVG(height) OVER (PARTITION BY age) AS avg_ht_age
     from sashelp.class ;
   quit ;

SAS报错日志

1          OPTIONS NONOTES NOSTIMER NOSOURCE NOSYNTAXCHECK;
        
          proc sql ;
           create table case1 as select
                    Name, age, height ,
                   AVG(height) OVER (PARTITION BY age) AS avg_ht_age
                                              ____
                                              22
                                              76
 ERROR 22-322: Syntax error, expecting one of the following: !, !!, &, *, **, +, ',', -, /, <, <=, <>, =, >, >=, ?, AND, BETWEEN, 
               CONTAINS, EQ, EQT, GE, GET, GT, GTT, LE, LET, LIKE, LT, LTT, NE, NET, OR, ^=, |, ||, ~=.  

 ERROR 76-322: Syntax error, statement will be ignored.

解决方案

报错原因

SAS的PROC SQL在9.4M5版本之前不支持窗口函数(OVER子句),如果你的SAS版本低于该版本,就会触发这个语法错误。

解决办法

  1. 升级SAS版本:将SAS升级到9.4M5及以上,之后可以直接使用OVER(PARTITION BY)窗口函数,原代码无需修改即可正常运行。
  2. 替代写法(无需升级):使用子查询关联的方式实现相同效果,代码如下:
proc sql;
  create table case1 as
    select 
      c.Name, c.age, c.height,
      a.avg_ht_age
    from sashelp.class c
    left join (
      select age, avg(height) as avg_ht_age
      from sashelp.class
      group by age
    ) a
    on c.age = a.age;
quit;

该代码通过子查询先计算各年龄的平均身高,再关联回原表,实现和窗口函数完全一致的结果——每行数据都会带上对应年龄的平均身高。

内容的提问来源于stack exchange,提问作者Aiko Vandijk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 13:15:03