保留变量不被保留

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;

这里可能发生两件事。

  1. 您的输出数据集名称与您的输入数据集名称相同(不好的做法 - 不要这样做)。如果你 运行 它有一次错误,它可能已经将 table 中的值更改为意外的值,这使得更正后的代码看起来像是失败了。要解决此问题,只需从头重新 运行 并将输出数据集名称更改为其他名称即可。
  2. 您的 value 字段有时可能包含空值?如果是这样, + 运算符会导致您的问题。如果其中一个参数为空,+ 运算符将始终为 return NULL。而是使用 sum() 函数。即 if sum_flag = 1 then sum=sum(sum,value);