我在sas上有两个表“table\u a”和“table\u a\u archive”,作为etl过程的一部分,“table\u a”是每天创建的,数据应该归档在“table\u a\u archive”上。当数据存档在“表\存档”时,将创建/更新一个标记“dt\标记”。
在第一天,这就是table的样子
"Table_A"
| ID | Load_Date
------ -------------
| 100 | 01JUN2020:12:13:56
"Table_A_Archive"
| ID | Load_Date | DT_FLAG
------ --------------------- ---------
| 100 | 01JUN2020:12:13:56 | 1
第2天
"Table_A"
| ID | Load_Date
------ ------------
| 101 | 02JUN2020:12:13:56
"Table_A_Archive"
| ID | Load_Date | DT_FLAG
------ --------------------- ---------
| 100 | 01JUN2020:12:13:56 | 2
| 101 | 02JUN2020:12:13:56 | 1
加载新数据时,dtu标志应为1,旧记录dtu标志应递增1。装货日期是关键。我已经写了一个sas代码,但它似乎有点混乱,有人能帮我一个sas数据步骤吗
%macro Cntl_archive(table_name=,arch_table_name=);
%GLOBAL WRK;
%if %sysfunc(exist(&arch_table_name.)) %then %do;
proc append base=&arch_table_name. data=&table_name. force;
run;
proc sql;
Create table TEMP as
Select distinct Load_Date,Load_Date as WRK from &arch_table_name.
order by Load_Date desc
;quit;
proc rank data=TEMP descending out=TEMP;
var WRK;
ranks count;
run;
data &arch_table_name. (drop=DT_FLAG);
set &arch_table_name.;
run;
proc sql;
Create table &arch_table_name. as
Select T0.*,T1.count as DT_FLAG from &arch_table_name. T0
inner join TEMP T1 on T0.Load_Date=T1.Load_Date
;quit
%end;
%else %do;
data &arch_table_name.;
set &table_name.;
DT_FLAG= 1;
IS_ACTIVE='';
run;
%end;
%mend Cntl_archive;
5条答案
按热度按时间f45qwnt81#
我想你也应该这样做
merge
声明:考虑到你可能希望这项日常工作尽可能快,我建议使用
update
或者modify
要替换的语句merge
:它更高效,因为它可以更新(或修改)数据,而无需创建数据集的副本。
arknldoa2#
下面是一个使用
MODIFY
语句更新现有观测值中的dt_标志值并附加新值。首先让我们创建一个初始的a,并使用它创建一个带有额外变量的空a\u存档(注意:我重命名了timestamp变量,以避免由于名为“date”的变量具有datetime值而不是date值而引起的混淆。)
现在让我们将一个附加到一个\u存档中。
现在您可以创建一个新版本的,并重新运行相同的数据步骤来附加它。
结果:
goucqfw63#
使用
Proc APPEND
和计算DT_FLAG
在需要的时候飞行。除了向档案中添加记录外,无需对档案进行任何处理。正在运行的将是数据步骤视图。
例子:
例子
want
数据集位于WORK.
但会是一些PERM.
在你的真实世界里。和观看
qxsslcnc4#
再考虑一下
proc sql
与计数相关的子查询。不幸的是,sas不允许用值更新表本身,因此使用临时表副本。下面假设id每天递增。8dtrkrch5#
我试着用这种方法解决它。