我不是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 = 16000
和max_balance_position = 3
此代码遍历数组中的每个值,但如何将此代码转换为SaS?谁能帮我?非常感谢。
答案 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;