【问题标题】:SAS conditionally execute PROC SQLSAS 有条件地执行 PROC SQL
【发布时间】:2018-06-25 16:54:16
【问题描述】:

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

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

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

IF oldSale

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

【问题讨论】:

  • 好奇,请向我们展示琐碎的 Python代码来源。

标签: sas conditional execution


【解决方案1】:

“逻辑”在细节上相当模糊,但要点似乎是

  • 导入每日销售额
  • 假设每日销售是完整的,并且每一天的销售都被代表了
  • 如果每日销售信息开始日期超过 30 天前
    • 从开始日期开始从主表中删除所有销售
    • 附加当前每日销售额

一种方法是使用一个宏来执行有条件的删除/附加作为“替换”操作。

%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;

【讨论】:

  • 谢谢,除了一件事外,这有效 - &oldestSale 不断返回 1.8435E9,并且 %Eval 不断给出错误:在 %EVAL 函数或需要数字操作数的 %IF 条件中找到字符操作数.
  • 这么大的数字可能是日期时间值(秒数)而不是日期值(天数)。在代码中进行适当的调整以处理日期时间值而不是日期值。
  • 使用 SYSEVALF 并且它有效。是的,所有日期都存储为日期时间值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多