如何将新导入的 table 的记录与存储在 SAS 服务器上的另一个 table 的记录相加?
How to accumulate the records of a newly imported table with the records of another table that I have stored on the servers in SAS?
我是 SAS 新手,遇到以下问题:
当尝试将我刚刚导入的记录(在一个 table 中)与我存储在另一个 table.
中的记录合并时
发生的事情是,我每天都要 运行 SAS 中的代码,我需要 table 我今天(17/05/2021)通过导入一个文件 'X',通过导入文件 'Y' 加入我昨天 (16/05/2021) 创建的 table。
因此代码将在明天、后天执行,依此类推。
总之,记录会随着时间的流逝而累积。
为了解决这个问题,我首先创建了两个变量,一个是代码执行的日期,另一个是上次执行的日期。
%let daily_date = 20210423; /*AAAAMMDD*/
%let last_execution_date = 20210422; /*AAAAMMDD*/
然后一个文件的导入就完成了,我们可以看到这个创建的名字table有代码执行的日期
data InputAC.RA_ratings&daily_date;
infile "&ruta_InputRA." FIRSTOBS=2
dsd lrecl=4096 truncover;
input
@1 RA_Customer_ID .
@11 Rating_ID 10.
@21 ISRM_Model_Overlay_ID .
@31 Constant_ID 10.
@41 Value 0.
;
run;
proc sort data=inputac.RA_ratings&daily_date;
by RA_Customer_ID Rating_ID;
quit;
最后 InputAC.RA_ratings&daily_date 与 InputAC.RA_ratings&last_execution_date[=40 的并集=] 制作。 ('InputAC.RA_ratings&last_execution_date'应该是比今天更早导入的table。)
data InputAC.RA_ratings&fec_diario;
merge
InputAC.RA_ratings&fec_diario
InputAC.RA_ratings&ultima_fecha_de_ejecucion;
by RA_Customer_ID Rating_ID;
run;
这就是 table 存储在服务器上的方式。
(忽略日期20210413,假设是20210422)
但是,我必须在不使用变量 'last_execution_date' 的情况下执行此任务。
我一直在研究,但我仍然找不到任何可以帮助我解决这个问题的 SAS 函数。
希望有人能帮帮我,先谢谢了。
从操作的角度来看,这是一个相当复杂且有趣的问题。答案取决于几件事。
- 您对该过程的执行有多少控制权?
- “昨天”是 gua运行teed,还是如果“最后执行日期”不是昨天,流程是否需要工作?
- 如果进程今天 运行 两次会怎样?
解决此问题的最佳实践方法是拥有一个存储最后执行日期[=49=的数据集(或table) ].这使您可以轻松处理 #2,而 #3 的答案可能会准确指导您如何存储它,但无论如何都很容易处理。
例如,假设您有一个 table、MetaAC.LastExecDate
(或者,在西班牙语中,MetaAC.UltimaFecha
或类似)。它可以这样存储东西:
data LastExecDate;
timestamp = datetime();
execdate = input(&daily_date,yymmdd8.);
run;
proc append base=MetaAC.LastExecDate data=LastExecDate;
run;
这使您可以存储任意 execdate
,即使它不是今天,也可以在您 运行 时存储它(用于审计目的),您甚至可以添加 who 运行如果这很有趣(有一个宏变量 &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 执行 input/put,%sysevalf
让你做数学。
如果您不希望它总是前一天(如果有周末,或其他您不一定想假设它是前一天的日子),那么您最好的选择是使用字典 tables 查看那里有什么并找到你日期之前的最大日期,或者使用 x 命令查看文件夹并执行相同的操作(使用 OS 命令可能比为此使用 SQL,有时 SQL 字典 table 可能会很慢)。
我是 SAS 新手,遇到以下问题: 当尝试将我刚刚导入的记录(在一个 table 中)与我存储在另一个 table.
中的记录合并时发生的事情是,我每天都要 运行 SAS 中的代码,我需要 table 我今天(17/05/2021)通过导入一个文件 'X',通过导入文件 'Y' 加入我昨天 (16/05/2021) 创建的 table。 因此代码将在明天、后天执行,依此类推。 总之,记录会随着时间的流逝而累积。
为了解决这个问题,我首先创建了两个变量,一个是代码执行的日期,另一个是上次执行的日期。
%let daily_date = 20210423; /*AAAAMMDD*/
%let last_execution_date = 20210422; /*AAAAMMDD*/
然后一个文件的导入就完成了,我们可以看到这个创建的名字table有代码执行的日期
data InputAC.RA_ratings&daily_date;
infile "&ruta_InputRA." FIRSTOBS=2
dsd lrecl=4096 truncover;
input
@1 RA_Customer_ID .
@11 Rating_ID 10.
@21 ISRM_Model_Overlay_ID .
@31 Constant_ID 10.
@41 Value 0.
;
run;
proc sort data=inputac.RA_ratings&daily_date;
by RA_Customer_ID Rating_ID;
quit;
最后 InputAC.RA_ratings&daily_date 与 InputAC.RA_ratings&last_execution_date[=40 的并集=] 制作。 ('InputAC.RA_ratings&last_execution_date'应该是比今天更早导入的table。)
data InputAC.RA_ratings&fec_diario;
merge
InputAC.RA_ratings&fec_diario
InputAC.RA_ratings&ultima_fecha_de_ejecucion;
by RA_Customer_ID Rating_ID;
run;
这就是 table 存储在服务器上的方式。
(忽略日期20210413,假设是20210422)
但是,我必须在不使用变量 'last_execution_date' 的情况下执行此任务。
我一直在研究,但我仍然找不到任何可以帮助我解决这个问题的 SAS 函数。 希望有人能帮帮我,先谢谢了。
从操作的角度来看,这是一个相当复杂且有趣的问题。答案取决于几件事。
- 您对该过程的执行有多少控制权?
- “昨天”是 gua运行teed,还是如果“最后执行日期”不是昨天,流程是否需要工作?
- 如果进程今天 运行 两次会怎样?
解决此问题的最佳实践方法是拥有一个存储最后执行日期[=49=的数据集(或table) ].这使您可以轻松处理 #2,而 #3 的答案可能会准确指导您如何存储它,但无论如何都很容易处理。
例如,假设您有一个 table、MetaAC.LastExecDate
(或者,在西班牙语中,MetaAC.UltimaFecha
或类似)。它可以这样存储东西:
data LastExecDate;
timestamp = datetime();
execdate = input(&daily_date,yymmdd8.);
run;
proc append base=MetaAC.LastExecDate data=LastExecDate;
run;
这使您可以存储任意 execdate
,即使它不是今天,也可以在您 运行 时存储它(用于审计目的),您甚至可以添加 who 运行如果这很有趣(有一个宏变量 &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 执行 input/put,%sysevalf
让你做数学。
如果您不希望它总是前一天(如果有周末,或其他您不一定想假设它是前一天的日子),那么您最好的选择是使用字典 tables 查看那里有什么并找到你日期之前的最大日期,或者使用 x 命令查看文件夹并执行相同的操作(使用 OS 命令可能比为此使用 SQL,有时 SQL 字典 table 可能会很慢)。