保留变量不被保留
Retained variable not being retained
我正在尝试根据特定条件使用保留来总结一个变量。我有这些字段 account_id、日期、交易、价值和 transaction_type.
数据按account_id和日期
排序
我想求和值,直到第一个 transaction_type 不在 ('A')
我有这个
data dset;
set dset;
by account_id;
retain sum_flag sum;
if first.account_id then do;
sum_flag = 1;
sum=0;
end;
if transaction_type not in ('A') then sum_flag = 0;
if sum_flag = 1 then sum=sum +value;
run;
我的问题是如果 A 中的第一个 transaction_type 那么它工作正常但是如果下一个 transaction_type 也是 A sum_flag 设置为 。而不是保持为 1。为什么会这样?
我认为这与
如果 transaction_type 不在 ('A') 中,则 sum_flag = 0;
没有它,如果事务在 'A' 中,变量 sum_flag 不会被重置为丢失,但我只希望保留值直到第一个非 'A' 事务。
Tom 可能是正确的,入站数据集在您尝试解决此问题的早期迭代中有额外的变量。
DOW 循环方法也适用,不需要保留或初始化 if。
data dset;
input group type $ value;
datalines;
1 A 1
1 A 2
1 A 3
1 A 4
1 B -5
1 A 8
2 A 0
2 A 9
2 A 33
3 B 9
;
run;
data dset;
sum = .; _summing=1;
do until (last.group);
set dset;
by group;
_summing = _summing and (type = 'A');
if _summing then sum + value;
output;
end;
drop _:; * dont keep state variables;
run;
这里可能发生两件事。
- 您的输出数据集名称与您的输入数据集名称相同(不好的做法 - 不要这样做)。如果你 运行 它有一次错误,它可能已经将 table 中的值更改为意外的值,这使得更正后的代码看起来像是失败了。要解决此问题,只需从头重新 运行 并将输出数据集名称更改为其他名称即可。
- 您的
value
字段有时可能包含空值?如果是这样, +
运算符会导致您的问题。如果其中一个参数为空,+
运算符将始终为 return NULL
。而是使用 sum()
函数。即 if sum_flag = 1 then sum=sum(sum,value);
我正在尝试根据特定条件使用保留来总结一个变量。我有这些字段 account_id、日期、交易、价值和 transaction_type.
数据按account_id和日期
排序我想求和值,直到第一个 transaction_type 不在 ('A')
我有这个
data dset;
set dset;
by account_id;
retain sum_flag sum;
if first.account_id then do;
sum_flag = 1;
sum=0;
end;
if transaction_type not in ('A') then sum_flag = 0;
if sum_flag = 1 then sum=sum +value;
run;
我的问题是如果 A 中的第一个 transaction_type 那么它工作正常但是如果下一个 transaction_type 也是 A sum_flag 设置为 。而不是保持为 1。为什么会这样?
我认为这与 如果 transaction_type 不在 ('A') 中,则 sum_flag = 0; 没有它,如果事务在 'A' 中,变量 sum_flag 不会被重置为丢失,但我只希望保留值直到第一个非 'A' 事务。
Tom 可能是正确的,入站数据集在您尝试解决此问题的早期迭代中有额外的变量。
DOW 循环方法也适用,不需要保留或初始化 if。
data dset;
input group type $ value;
datalines;
1 A 1
1 A 2
1 A 3
1 A 4
1 B -5
1 A 8
2 A 0
2 A 9
2 A 33
3 B 9
;
run;
data dset;
sum = .; _summing=1;
do until (last.group);
set dset;
by group;
_summing = _summing and (type = 'A');
if _summing then sum + value;
output;
end;
drop _:; * dont keep state variables;
run;
这里可能发生两件事。
- 您的输出数据集名称与您的输入数据集名称相同(不好的做法 - 不要这样做)。如果你 运行 它有一次错误,它可能已经将 table 中的值更改为意外的值,这使得更正后的代码看起来像是失败了。要解决此问题,只需从头重新 运行 并将输出数据集名称更改为其他名称即可。
- 您的
value
字段有时可能包含空值?如果是这样,+
运算符会导致您的问题。如果其中一个参数为空,+
运算符将始终为 returnNULL
。而是使用sum()
函数。即if sum_flag = 1 then sum=sum(sum,value);