SAS将非连续日度数据按周一为起始周汇总的报错问题咨询
需求说明
对非连续日度业务数据以每周一为起始周期按周汇总求和,现有数据包含5个字段:ID、PKG、Revdt(日期时间型)、code、QTY,要求汇总后输出和原数据结构一致的结果。
原代码报错原因
你遇到的报错和逻辑问题主要来自3个方面:
- 语法错误:
datepart(week, revdt)写法不符合规范,datepart第一个参数为返回的时间单位标识,正确取周数的写法为datepart(ww, revdt),错误的函数调用导致查询无法返回有效字段,是触发「至少需要1列」报错的直接原因 - 分组规则错误:SQL分组查询要求
select后所有非聚合字段都必须加入group by,原代码仅按周分组,但查询结果包含ID、Pkg、code三个非聚合字段,逻辑本身不成立 - 周规则不符:默认周函数的周起始日为周日,需要额外调整参数才能实现周一为周起始的规则
- 额外注意:你提供的样例数据中存在无效日期
1QAUG2021:00:00:00,需要先修正数据避免日期处理失败
正确实现方案
优先推荐先把原始数据拉到SAS本地再做汇总,避免不同数据库透传SQL的语法差异,代码如下:
/* 第一步:拉取原始数据到本地临时库 */ Proc sql; connect to odbc (dsn='' id='' p=''); create table work.raw_data as select * from connection to odbc (select ID, PKG, Revdt, code, QTY from datebase); disconnect from odbc; quit; /* 第二步:按周一为起始的周规则汇总,输出和原结构完全一致的结果 */ proc sql; create table work.WeeklySum as select ID, PKG, /* 取当前日期所在周的周一作为Revdt的值,格式和原数据保持一致 */ intnx('week.2', datepart(Revdt), 0, 'b') format=date9. as Revdt, code, sum(QTY) as QTY from work.raw_data /* 所有非聚合字段全部加入group by */ group by ID, PKG, calculated Revdt, code; quit;
如果你需要直接在透传SQL中完成汇总,需要根据你底层连接的数据库类型调整周计算函数:
- MySQL:用
week(revdt, 1)取周一为起始的周数 - SQL Server:用
dateadd(week, datediff(week, 0, dateadd(day, -1, revdt)), 0)计算当周周一日期 - Oracle:用
trunc(revdt, 'IW')获取当周周一日期
所有透传SQL都需要给每个返回字段加明确别名,避免SAS识别字段失败。
内容的提问来源于stack exchange,提问作者SASNoob
相关产品推荐
相关产品推荐

