选择第一个,然后选择下一个

Choose first occurrence and then choose the next one down

在 SAS(Data Step) 或 Proc SQL 中,我想先根据 DaysBetweenTrans 选择第一次出现的 TransB,然后选择标志,如果已经选择了 TransB,那么我想要下一个可用的,尽管我也希望 TransA 也是唯一的,即 TransA 是一个唯一的行,TransB 也是唯一的。

例如,原来的table是这样的:

TransA TransB DaysBetweenTrans Flag
A 1 1 1
A 2 1 1
B 1 3 1
B 2 2 1
B 3 3 1
C 1 1 1
C 3 4 1

但我只想要:

TransA TransB DaysBetweenTrans Flag
A 2 1 1
B 1 3 1
C 3 4 1

我尝试使用对 TransA 和 dedupkey 进行排序,然后对 TranB 和 dedupkey 进行排序,但没有成功。我想到的另一种方法是 first.TransA 并输出。重新加入原来的 table 并删除任何 TransA 并重复,但必须有更好的方法。

您可能想查看 SAS 优化过程,因为采用针对当前情况的最佳下一次匹配的直接方法可能找不到最佳解决方案。

这是一种使用 HASH 来跟踪已分配目标的方法。

我不太清楚你喜欢点什么,但这是一种方法。听起来您想找到 TRANSB=1 的最佳匹配。然后对于TRANSB=2等

data have;
  input TransA $ TransB $ DaysBetweenTrans Flag;
cards;
A 1 1 0
A 2 1 1
B 1 3 1
B 2 2 1
B 3 3 1
C 1 1 1
C 3 4 1
;

proc sort data=have;
  by transB daysbetweentrans descending flag transA;
run;

data _null_;
  if _n_=1 then do;
    declare hash h(ordered:'Y');
    rc=h.definekey('transA');
    rc=h.definedata('transA','transB','daysbetweentrans','flag');
    rc=h.definedone();
  end;
  set have end=eof;
  by transB;
  if first.transB then found=0;
  retain found;
  if not found then if not h.add() then found=1;
  if eof then do;
    rc=h.output(dataset:'want');
  end;
run;

结果:

                           Days
       Trans    Trans    Between
Obs      A        B       Trans     Flag

 1       A        2         1         1
 2       B        3         3         1
 3       C        1         1         1