Обратите внимание, что приведенный ниже код работает как есть... не стесняйтесь копировать/вставлять и запускать его в своей системе, чтобы увидеть результаты.
Я бы начал с использования таблицы dictionary.columns
, чтобы найти только те таблицы, которые вы ищете. Единственное поле, которое нам нужно сохранить в каждой таблице, — это поле date
. Это необходимо, чтобы избежать каких-либо конфликтов (в случае, если одно и то же имя поля было определено как символьное и числовое в разных таблицах).
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.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...
21.09.2015