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