请注意下面的代码是按照原样运行的......可以随意复制/粘贴并在系统上运行以查看结果。
我首先使用dictionary.columns
表找到您正在查找的表。我们需要保留每个表的唯一字段是date
字段。这是为了避免任何冲突(如果相同的字段名称在不同的表中被定义为char和numeric)。
proc sql noprint;
select distinct cats(libname,'.',memname,'(keep=date)')
into :tables separated by ' '
from dictionary.columns
where libname eq "SASHELP"
and upcase(name) eq "DATE"
;
quit;
%put &tables;
给出:
SASHELP.AIR(保持=日期)SASHELP.BUY(保持=日期) SASHELP.CITIDAY(保持=日期)SASHELP.CITIMON(保持=日期) SASHELP CTIQTR(保留=日期)SASHELP.CITIWK(保留=日期) SASHELP.CITIYR(保留=日期)SASHELP.GNGSMP2(保留=日期) SASHELP.GNP(保留=日期)SASHELP.NVST1(保留=日期) SASHELP.NVST2(保留=日期)SASHELP.NVST3(保留=日期) SASHELP.NVST4(保留=日期)SASHELP.NVST5(保留=日期) SASHELP.PRDSAL3(保留=日期)SASHELP.PRICEDATA(保留=日期) SASHELP.RENT(保留=日期)SASHELP.RETAIL(保留=日期) SASHELP.ROCKPIT(保留=日期)SASHELP.SNACKS(保留=日期) SASHELP.STEEL(保留=日期)SASHELP.STOCKS(保持=日期) SASHELP.USECON(保持=日期)SASHELP.WORKERS(保持=日期)
接着,使用一个视图来连接所有的表一起。我本来希望跳过这一步,但发现无法做到这一点,并一次使用保持/逐组处理/ indsname选项。如果您的表格很小,您可能只想输出一个常规数据集而不是视图。
data tmp/view=tmp;
set &tables indsname=ds_name;
dataset_name=ds_name;
run;
使用by-group
处理来跟踪每个表中最后日期的记录数。这假设最后日期也是最大日期(您可能需要在数据中检查这一点)。
data want;
set tmp;
by dataset_name ;
retain count dataset_name;
if first.dataset_name then do;
count=0;
end;
count = count+1;
if last.dataset_name then do;
output;
end;
keep count date dataset_name;
run;
最终输出:
Obs DATE dataset_name count
1 DEC60 SASHELP.AIR 144
2 JAN06 SASHELP.BUY 11
3 FEB92 SASHELP.CITIDAY 1069
4 JAN92 SASHELP.CITIMON 145 etc...
是数据集名的日期部分?如果是这样,请提供一个示例表名。 –
是的,所以我有大约40个表格,其中20个具有日期列,所以我想为这些表应用过滤器,对没有此列的表执行任何操作。 –
好的,我们将假设你的表名是完全不同的。日期栏的名称是什么? –