如何将新导入的表的记录与存储在SAS服务器上的另一个表的记录累加起来?

如何将新导入的表的记录与存储在SAS服务器上的另一个表的记录累加起来?,sas,Sas,我是SAS的新手,有以下问题: 当尝试连接记录时,我刚刚导入(在一个表中)了存储在另一个表中的记录 发生的事情是,我将每天在SAS中运行代码,我需要通过导入文件“X”来创建今天(2021年5月17日)要创建的表,通过导入文件“Y”来加入我昨天(2021年5月16日)创建的表。 代码将在明天、第二天执行,依此类推。 总之,这些记录将随着时间的推移而积累 为了解决这个问题,我首先创建两个变量,一个是代码执行的日期,另一个是最后一次执行的日期 %let daily_date

我是SAS的新手,有以下问题: 当尝试连接记录时,我刚刚导入(在一个表中)了存储在另一个表中的记录

发生的事情是,我将每天在SAS中运行代码,我需要通过导入文件“X”来创建今天(2021年5月17日)要创建的表,通过导入文件“Y”来加入我昨天(2021年5月16日)创建的表。 代码将在明天、第二天执行,依此类推。 总之,这些记录将随着时间的推移而积累

为了解决这个问题,我首先创建两个变量,一个是代码执行的日期,另一个是最后一次执行的日期

%let daily_date                = 20210423; /*AAAAMMDD*/
%let last_execution_date = 20210422; /*AAAAMMDD*/
然后导入一个文件,我们可以看到这个创建表的名称有代码执行的日期

data InputAC.RA_ratings&daily_date;
infile "&ruta_InputRA." FIRSTOBS=2
dsd lrecl=4096 truncover;
input
@1 RA_Customer_ID $10.
@11 Rating_ID 10.
@21 ISRM_Model_Overlay_ID $10.
@31 Constant_ID 10.
@41 Value $100.
;
run;

proc sort data=inputac.RA_ratings&daily_date;
by RA_Customer_ID Rating_ID;
quit;
最后,inputa.RA\u评级和每日执行日期inputa.RA\u评级和最后执行日期合并。(“InputAC.RA_ratings&last_execution_date”应该是在比今天更早的日期导入的表。)

这就是表在服务器上的存储方式

(忽略日期20210413,让我们假设它是20210422)

但是,我必须在不使用变量“last_execution_date”的情况下执行此任务。

我一直在研究,但我仍然找不到任何SAS函数可以帮助我解决这个问题。
我希望有人能帮助我,非常感谢你。从运营的角度来看,这是一个非常复杂和有趣的问题。答案取决于几件事

  • 您对该流程的执行有多大的控制权
  • 是否保证“昨天”,或者如果“最后执行日期”不是昨天,流程是否需要工作
  • 如果流程今天运行两次,会发生什么
  • 解决此问题的最佳实践方法是使用一个数据集(或表)存储上次执行日期。这使您可以轻松地处理#2,而#3的答案可能会准确地指导您如何存储它,但无论如何都很容易处理

    例如,假设您有一个表,
    MetaAC.LastExecDate
    (或者,在西班牙语中,
    MetaAC.UltimaFecha
    或类似的表)。它可以这样存储东西:

    data LastExecDate;
      timestamp = datetime();
      execdate  = input(&daily_date,yymmdd8.);
    run;
    
    proc append base=MetaAC.LastExecDate data=LastExecDate;
    run;
    
    这使您可以存储任意的
    execdate
    ,即使它不是今天,也可以存储运行它的时间(出于审计目的),如果有兴趣,您甚至可以添加运行它的人(有一个宏变量
    &sysuserid
    或类似变量)。然后将所有这些放在流程的底部,它会随着您的进展而更新

    然后,你可以从中提取你想要的确切信息-例如

    proc sql;
      select max(execdate)
        into :last_exec_date
        from MetaAC.LastExecDate
        where execdate ne today()
      ;
    quit;
    
    现在,如果你因为某种原因不能控制它,你可以用另一种方式来确定。同样,确切的过程取决于你的情况以及你对2和3的回答

    如果你对2的回答是你总是希望它是昨天,那么这真的很容易-只要这样做:

    %let daily_date=20210517;
    %let last_execution_date = %sysfunc(putn(%sysevalf(%sysfunc(inputn(&daily_date,yymmdd8.))-1),yymmddn8.));
    %put &=last_execution_date;
    
    这两个
    %sysfuncs
    只需在宏语言中执行SAS datastep的输入/输出,而
    %sysevalf
    则允许您执行数学运算


    如果您不希望它总是前一天(如果有周末,或者其他您不一定希望假定它是前一天的日子),那么您最好使用字典表查看其中的内容并找到日期之前的最大日期,或者使用x命令查看文件夹并执行相同的操作(为此,使用OS命令可能比使用SQL更容易,有时SQL字典表可能速度较慢).

    您是否只想获得关于如何计算今天和昨天的值的建议?或者您是否还需要了解如何组合数据的帮助?我还需要了解如何组合数据的帮助。非常感谢。在组合时,新记录是否替换旧记录(或至少任何匹配的旧记录)?或者结果是否需要包括所有记录?您是否需要跟踪记录来自哪个数据负载?或者数据中的某些字段已经覆盖了这些数据负载?是的,在某些情况下,新记录将替换旧记录,此项目中处理的信息来自客户,因此可能会丢失似乎我们有来自客户的新信息,这些信息必须替换来自同一客户的旧信息。我不理解最后两个问题。我完全控制流程的执行,实际上这是一个SAS项目,它有一系列将要执行的程序,但必须导入的文件是f非常重要,因为它们包含整个项目执行过程中将要处理的所有信息。同样,代码不会总是在前一天执行,因为代码不会在周末执行。如果今天执行两次,第二次执行的结果应与第一次执行的结果相同。“我正试图理解你的建议,穆查斯·格雷西亚斯”。“安吉拉·帕胡阿马尼听起来像是一个元数据表(意思是,一个存储数据信息的表)是一个很好的方法——只要把它想象成一个日志表,你每次编写新数据集时都会写入它。”。
    %let daily_date=20210517;
    %let last_execution_date = %sysfunc(putn(%sysevalf(%sysfunc(inputn(&daily_date,yymmdd8.))-1),yymmddn8.));
    %put &=last_execution_date;