2017-07-14 65 views
0

我有多個日期每IID,我期待找到最大(也許最小的路)在組內只有如果另一個變量不見了。看看下面的測試數據:SAS proc sql查找最小/最大隻在組內丟失/非丟失

data test; 
    informat EFF_DATE END_DATE date9.; 
    length IID $12 EFF_DATE END_DATE 8; 
    input IID $ EFF_DATE END_DATE; 
    format EFF_DATE END_DATE date9.; 
    datalines; 
    A 11MAY15 . 
    A 12SEP13 01JAN15 
    A 13DEC12 . 
    B 25AUG14 . 
    B 13JUN17 01JAN15 
    B 03NOV13 . 
    ; 
run; 

我的計劃是建立過下面的代碼通過IID計算最大EFF_DATE,但只有當END_DATE丟失,我無法弄清楚如何在sql添加此邏輯。

proc sql noprint; 
    create table test_fill as 
    select *, 
     max(EFF_DATE) /* add something here? */ as MOST_RECENT_EFF_DATE format=date9. 
    from test group by IID; 
quit; 

下面顯示了所需的輸出:

IID EFF_DATE END_DATE MOST_RECENT_EFF_DATE 
A 11MAY15  .   11MAY15 
A 12SEP13  01JAN15  11MAY15 
A 13DEC12  .   11MAY15 
B 25AUG14  .   25AUG14 
B 13JUN17  01JAN15  25AUG14 
B 03NOV13  .   25AUG14 

對於IID = B,即使13JUN17是最大日期,因爲END_DATE是我們不能接受非缺失,所以我需要採取下最高的日期。我敢肯定,我可以編寫一堆數據步驟併合並回來,但如果可能的話,我想嘗試在sql之間敲出來。

回答

3

您包括的條件爲casemax函數內部,與else被空(這是不是有史以來max,也不是min)。

proc sql noprint; 
    create table test_fill as 
    select *, 
     max(case when missing(end_Date) then EFF_DATE else . end) as MOST_RECENT_EFF_DATE format=date9. 
    from test group by IID; 
quit; 
+0

謝謝@Joe - 正是我在找什麼。嵌套的case when語句對我所有的邏輯都是有用的! – Foxer