SAS Proc SQL中日期过滤方式不同导致结果差异的问题排查
问题分析与修正方案
错误原因
你修改后的where子句逻辑完全错误:
where blng_dt between intnx('month', blng_dt, -2, 'b') and intnx('month', blng_dt, -2, 'e')
这里用每行的blng_dt作为intnx的起始日期,相当于对每一行单独计算一个日期范围(当前行日期往前推2个月的首尾),然后判断该行日期是否落在这个自己的范围内。只有当某行的blng_dt恰好等于它所在月份往前推2个月的某个日期时才会被选中,这就是结果行数骤降的核心原因。
修正方案
要实现动态取「固定基准日期往前推2个月的整月数据」,需要用固定的基准日期(比如系统当前日期today())来计算日期范围,而不是依赖每行的blng_dt。同时原代码中distinct(t.shp_pro)与聚合函数混用的写法不规范,建议用group by替代,逻辑更清晰且执行效率更高。
修正后的代码:
libname orac oracle authdomain=XX path=XX schema=XX; proc sql; create table ship_bill_date as select t.shp_pro, min(t.blng_dt) as blng_dt, count(t.shp_pro) as count from orac.table_A t where blng_dt between intnx('month', today(), -2, 'b') and intnx('month', today(), -2, 'e') group by t.shp_pro; quit;
补充说明
- 如果不需要基于当前日期,而是要基于某个固定日期(比如你原来的
'01-JUL-2023'd,往前推2个月就是5月),可以把today()替换成该固定日期:intnx('month', '01-JUL-2023'd, -2, 'b') intnx函数的最后一个参数:'b'代表取月份起始(月初),'e'代表取月份结束(月末),确保覆盖整月所有数据。
内容的提问来源于stack exchange,提问作者Rogue258
相关产品推荐
相关产品推荐

