2016-10-05 49 views
0

我想在SAS中編寫一個PROC SQL查詢來確定以特定字母(例如RF *)開頭的許多列的最大值。現有的proc意味着我已經這樣做了。使用proc sql語句找到許多列的最大值

proc means data = input_table nway noprint missing; 
    var age x y z RF: ST: ; 
    class a b c; 
    output out = output_table (drop = _type_ _freq_) max=; 
run; 

其中列RF:指所有以RF開始的列,對於ST也是如此。我想知道PROC SQL中是否有類似的東西,我可以使用它?

謝謝!

+0

您可能必須使用動態SQL。這裏有一篇關於它的文章:http://support.sas.com/resources/papers/proceedings12/070-2012.pdf – Nicarus

+0

這個聲明是宏的一部分,我多次運行它,所以動態SQL可能會使它更加複雜。除此之外還有其他解決方法嗎? –

+0

我知道在PROC SQL中完成這項工作的唯一方法是將數據標準化(「不轉移」),以使列現在處於行中。這可能不可行,具體取決於您的數據集格式。 – Nicarus

回答

1

如果您必須使用SQL,動態SQL確實是這樣做的方法。好消息是,只能使用一個宏變量在一個proc sql調用中完成所有操作,例如:

proc sql noprint; 
    select catx(' ','max(',name,') as',name) into :MAX_LIST separated by ',' 
    from dictionary.columns 
    where libname = 'SASHELP' 
    and memname = 'CLASS' 
    and type = 'num' 
    /*eq: is not available in proc sql in my version of SAS, but we can use substr to match partial variable names*/ 
    and upcase(substr(name,1,1)) in ('A','W') /*Match all numeric vars that have names starting with A or W*/ 
    ; 
    create table want as select SEX, &MAX_LIST 
    from sashelp.class 
    group by SEX; 
quit; 
+0

謝謝!這有幫助! –