我试图根据某些条件使用retain来总结一个变量。我有这些字段account_id,date,transaction,value和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也是一个sum_flag被设置为。而不是保持为1.为什么会发生这种情况?
我认为这与某些事情有关 如果transaction_type不在('A')中则sum_flag = 0; 如果没有它,如果事务处于'A',则变量sum_flag不会被重置为丢失,但我只希望保留该值直到第一个非'A'事务。
答案 0 :(得分:0)
Tom可能是正确的,因为入站dset在尝试解决此问题时会从先前的迭代中获得额外的变量。
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;
答案 1 :(得分:0)
这里可能会发生两件事。
value
字段有时可能包含空值?如果是这样,+
运算符会导致您的问题。如果+
运算符中的某个参数为空,则NULL
运算符将始终返回sum()
。而是使用if sum_flag = 1 then sum=sum(sum,value);
函数。即...
PARTITION BY RANGE (TEST_DATE) INTERVAL (INTERVAL '1' MONTH)
(PARTITION A_INITIAL VALUES LESS THAN (DATE '2014-01-01')