請注意下面的代碼是按照原樣運行的......可以隨意複製/粘貼並在系統上運行以查看結果。
我首先使用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個具有日期列,所以我想爲這些表應用過濾器,對沒有此列的表執行任何操作。 –
好的,我們將假設你的表名是完全不同的。日期欄的名稱是什麼? –