使用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版本低于该版本,就会触发这个语法错误。
解决办法
- 升级SAS版本:将SAS升级到9.4M5及以上,之后可以直接使用
OVER(PARTITION BY)窗口函数,原代码无需修改即可正常运行。 - 替代写法(无需升级):使用子查询关联的方式实现相同效果,代码如下:
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
相关产品推荐
相关产品推荐

