2015-10-06 275 views
0

我有一個可能非常簡單的問題。我有一個包含不同時間段的行的數據集。每年將新的時間段添加到數據集中。 在我的數據集中,我有52,53和54期。很快就會增加55期。 在下面的代碼我提取從最近一段時期(54)行:變量的SAS最大值

data new; 
set old; 
if period=54; 
run; 

而是硬編碼54(很快55)我想SAS能夠識別最大的時間段,所以我不的」每次將新週期添加到數據集時,都必須糾正該數字。我曾經嘗試這樣做:

data new; 
set old; 
if period=max(period); 
run; 

但是max函數至少需要兩個參數,這是不是我想要的。任何人都可以告訴我使用哪個函數嗎?

非常感謝。

親切的問候瑪麗亞

+0

您是否每個時間段只有一行或多行? – Longfish

回答

0

創建舊的僅包含最新期的一個子集可以做容易使用PROC SQL:

PROC SQL NOPRINT; 
    CREATE TABLE new AS 
    SELECT * 
    FROM old 
    WHERE period = (SELECT MAX(period) FROM old); 
QUIT; 
+0

謝謝 - 這工作。奇怪的是,你可以在sql中使用最大函數,而不是在數據步驟中。 – user1626092

+1

畢竟這並不奇怪。 SQL中的MAX()是一個集合函數,它對一組行進行處理,而datastep中的MAX()適應其迭代本質,因此用於查找兩個值中較大的一個(通常是保留的當前最大值之一) 。 – cstotzer

1

一種選擇是使用macrovariable和PROC SQL一步拿到maxperiod,如:

proc sql; 
select max(period) into: maxp from old; 
quit; 

data new; 
set old; 
if period = "&maxp"; 
run; 
+0

This Works - thank you! – user1626092

1

你應該考慮保持在數據設定最後期限,你不必每次需要訪問達時間來計算的話TA。同時創建一個INDEX以優化檢索。

25   options msglevel=i; 
26   data example(index=(period)) lastperiod(keep=period); 
27   set sashelp.class(in=in1) sashelp.class(in=in2) end=eof; 
28   period = ifn(in1,54,55); 
29   output example; 
30   if eof then output lastperiod; 
31   run; 
32   
33   data _null_; 
34   set period; 
35   call symputx('LastPeriod',period); 
36   run; 
37   data period; 
38   set example; 
39   where period eq &lastperiod; 
INFO: Index period selected for WHERE clause optimization. 
40   run;