SAS 有条件地执行 PROC SQL

SAS conditionally execute PROC SQL

我正在构建代码,导入过去 30 天的每日销售文件,然后在主 table 中替换最近 30 天的记录。如果导入的每日文件有足够的记录,我只想替换最近 30 天:

proc sql;
select min(sale_date) into :oldestSale from daily_sales;
quit;

这是我想在 SAS 中构建的逻辑:

IF oldestSale < (today() - 30) THEN PROC SQL to replace ELSE do nothing END

最好的解决方案是什么?这在 Python 中是微不足道的,我正在从中翻译它,但我坚持使用 SAS 语法来做类似的事情......

'logic'在细节上相当模糊,但大意似乎是

  • 导入每日销售额
  • 假设每日销售已完成并且每一天的销售都被代表
  • 如果每日销售信息开始日期超过 30 天前
    • 从开始日期
    • 删除主要table的所有销售
    • 追加当前每日销售额

一种方法是使用一个宏来执行条件 remove/append 作为 'replace' 操作。

%macro process_daily_sales;
  proc import … out=daily_sales;
  run;

  %local oldestSale;
  %let oldestSale = %sysfunc(today()); %* sentinel value just in case;

  proc sql;
    select min(sale_date) into :oldestSale from daily_sales;
  quit;

  %local gap;
  %let gap = %eval ( %sysfunc(today()) - &oldestSale );

  %if &gap > 30 %then %do;
    proc sql;
      delete from main_sales where sales_date >= &oldestSale;
    quit;
    proc append base=main_sales data=daily_sales;
    run;
  %end;
%mend;