SaS循环遍历单个数据集

时间:2015-01-09 13:10:24

标签: loops dataset sas

我不是SaS的火箭科学,但我想尝试在SaS中和在Java中一样。

假设我有一个SaS数据集,我想逐个浏览每条记录,然后将从迭代中收集的值与最终数字进行比较。

在Java中,循环遍历一个数组,在这种情况下,它将与来自SaS数据集的单个列的整个数据集相同。

示例如下:

我有一个帐户余额列表,我想检查迭代的当前余额是否高于先前存储的最大值,如果是,则存储它,并保持循环直到我存储最高的帐户平衡。

我知道这可以通过SQL max完成,但我想知道如何迭代SaS数据集,尽管我也会感谢任何有效的SQL答案。

SaS数据集看起来像这样。

acct_number            owner_name            acct_balance
0123456789             name1                 12000
1234567890             name2                 16000
2345678901             name3                 14000

但我只对acct_balance列感兴趣。

作为代码示例,在Java中就是这样。

int[] acct_balances = new int[8];
int[0] = 10000;
int[1] = 12000;
int[2] = 11000;
int[3] = 16000;
int[4] = 14000;
int[5] = 5000;
int[6] = 16000;
int[7] = 15000;
int max_balance = 0;
int max_balance_position = 0;

int iteration_position = 0;
int maximum_position = acct_balances.length;

do {
    if (acct_balances[iteration_position] > max_balance) {
      max_balance = acct_balances[iteration_position];
      max_balance_position = iteration_position;
    }
  iteration_position ++;
} while(iteration_position < maximum_position);

最后,输出将为max_balance = 16000max_balance_position = 3

此代码遍历数组中的每个值,但如何将此代码转换为SaS?谁能帮我?非常感谢。

2 个答案:

答案 0 :(得分:2)

SAS循环遍历每一行,因此您不需要创建循环。问题是您希望输出数据集看起来像什么。这个答案将创建一个单独使用max的数据集。

data max_acct_balance;
  set have end=eof;
   retain max_acct_balance max_record;
   if acct_balance>max_acct_balance then do;
      max_record=_n_;
      max_acct_balance=acct_balance;
   end;
   if eof then output;
run;

答案 1 :(得分:0)

您可以将cnt添加到数据文件

proc sql;
     create table test as
            select *, monotonic() as cnt
                   from org_data_set;
quit;

然后使用:

proc sql;
     select bal, cnt-1 as CNT
            from test
                  where cnt = select min(cnt)
                                     from test 
                                          where bal = select max(bal) 
                                                from test;
quit;