2015-09-21 3 views
1

Я пытаюсь получить количество строк для таблиц с несколькими значениями, но только для последней даты. Код ниже указывает количество строк по таблице (без фильтра). Как я могу получить только количество записей для последней даты?Фильтр добавления SAS

proc sql; 
select cats("&libname..",memname) 
    into :tables separated by ' ' 
    from dictionary.tables 
    where libname=upcase("&libname."); 
quit; 

data counts; 
set &tables. indsname=ds_name end=eof; 
retain count dataset_name; 
if _n_=1 then count=0; 
if ds_name ne lag(ds_name) and _n_ ne 1 then do; 
    output; 
    count=0; 
end; 
dataset_name=ds_name; 
count = count+1; 
if eof then output; 
keep count dataset_name; 
run; 
+1

ли дата часть имени набора данных? Если да, укажите пример таблицы. –

+0

Да, поэтому у меня около 40 таблиц и 20 из них имеют столбец даты, поэтому я хочу применить фильтр для этих таблиц и ничего не делать для таблиц, которые не имеют этого столбца. –

+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 (держать = дата) 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... 
Смежные вопросы