Обратите внимание, что приведенный ниже код работает как есть ... не стесняйтесь копировать/вставлять и запускать его в своей системе, чтобы увидеть результаты.
Я бы начал с таблицы 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 .CITIQTR (keep = date) SASHELP.CITIWK (keep = date) SASHELP.CITIYR (keep = date) SASHELP.GNGSMP2 (keep = date) SASHELP.GNP (keep = date) SASHELP.NVST1 (keep = date) SASHELP.NVST2 (keep = date) SASHELP.NVST3 (keep = date) SASHELP.NVST4 (keep = date) SASHELP.NVST5 (keep = date) SASHELP.PRDSAL3 (keep = date) дата) SASHELP.PRICEDATA (keep = date) SASHELP.RENT (сохранить = дата) SASHELP.RETAIL (сохранить = дата) SASHELP.ROCKPIT (сохранить = дата) SASHELP.SNACKS (keep = date) 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...
ли дата часть имени набора данных? Если да, укажите пример таблицы. –
Да, поэтому у меня около 40 таблиц и 20 из них имеют столбец даты, поэтому я хочу применить фильтр для этих таблиц и ничего не делать для таблиц, которые не имеют этого столбца. –
Хорошо, будем считать, что имена ваших таблиц различны. Каково имя столбца даты? –