我正在尝试获取多个表的行数,但仅限于最新日期。 下面的代码按表格给出行计数(无过滤器)。我怎样才能获得最新日期的记录数?
ListViewItem
答案 0 :(得分:1)
请注意以下代码按原样运行...随意复制/粘贴并在系统上运行以查看结果。
我首先使用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(keep = date)SASHELP.BUY(保持=日期) SASHELP.CITIDAY(保持=日期)SASHELP.CITIMON(保持=日期) SASHELP.CITIQTR(保持=日期)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(保留=日期)
接下来,使用视图将所有表连接在一起。我本来希望跳过这一步,但发现不可能这样做,并同时使用keep / by-group-processing / 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...