SaS 循环遍历单个数据集

SaS loop through single dataset

我不是 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?谁能帮我?非常感谢。

SAS 隐式循环遍历每一行,因此您无需创建循环。问题是您希望您的输出数据集看起来像什么。此答案将创建一个仅包含最大值的数据集。

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;

您可以将 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;