2013-08-30 72 views
0

說我有一個表Tbl這是排序3列{a,b,c}我還有另外100列,其中之一是d。我怎樣才能標記last row by a group such that d=something,這個標誌應該是一個新的專欄。希望這是可行的,而無需重新排序整個表我怎樣才能選擇最後一組在SAS中的東西

a b c ...many columns... d IDX 
1      5 1       
1      3 2 
1      3 3 
2      3 4 
2      3 5 
2      2 6 
2      2 7 

在這個表中,我們希望另一列newCol添加到標誌last row by group a where d = 3

a b c ...many columns... d IDX newCol 
1      5 1 0      
1      3 2 0 
1      3 3 1 
2      3 4 0 
2      3 5 1 
2      2 6 0 
2      2 7 0 

回答

1
data want; 
set have; 
by a d notsorted; 
if last.d and d=3 then flag=1; 
run; 

這就要求數據集以有用的方式進行排序 - 它並不一定是爲了通過d,但它必須有一個值的所有D的同時(即不3 3 1 3 4 1 2 33 3 3 3 4 1 1 2是好的)。

如果情況並非如此,那麼就沒有一種解決方案不依賴於某種方式的排序,無論它是SQL(它對數據進行排序,它只是不會告訴你它正在做) ,PROC SORT或散列表(如果你可以將所有內容放入內存中,可能是最快的排序)。

+0

有趣!感謝這些我不知道的未排序的東西,不幸的是'd'沒有按照你的要求分組。 – statquant

0

我不知道該如何被實現,但以下是您想要的工作:

proc sql; 
    select a, b, c, . . . 
    from t 
    group by a, b 
    having c = max(c); 

請注意,該語法對於SAS proc sql非常具體。它不是ANSI標準,不適用於大多數其他數據庫。

這使用一個名爲「remerging」的過程。我不確定它是否使用原始表格。

編輯:

檢舉的線條也很簡單:

proc sql; 
    select a, b, c, (case when c = max(c) then 'Y' else 'N' end) as flag, . . . 
    from t 
    group by a, b; 

但是,如果數據已經排序,它可能是更有效地使用用於此目的的數據的步驟。

+0

我更新了所有道歉都不清楚的問題 – statquant

相關問題