2015-10-06 255 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;