2015-09-21 99 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 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...