SAS添加过滤器

时间:2015-09-21 14:13:07

标签: sas

我正在尝试获取多个表的行数,但仅限于最新日期。 下面的代码按表格给出行计数(无过滤器)。我怎样才能获得最新日期的记录数?

ListViewItem

1 个答案:

答案 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(keep = date)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...