保留变量未被保留

时间:2017-09-28 10:31:02

标签: sas retain

我试图根据某些条件使用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'事务。

2 个答案:

答案 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)

这里可能会发生两件事。

  1. 您输出的数据集名称与输入数据集名称相同(不好的做法 - 不要这样做)。如果你错误地运行了一次,它可能会将表中的值更改为意外的值,然后使更正的代码看起来像它失败了。要解决此问题,只需从头开始重新运行并将输出数据集名称更改为其他名称。
  2. 您的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')