SAS表中的序列

SAS表中的序列,sas,sequence,datastep,Sas,Sequence,Datastep,我希望在sas数据集中添加一个序列列,但要根据ID和事务日期。为了举例说明,以下是我所指的表格: ID | TXN_DT | 01 | 01JAN2020 | 01 | 01JAN2020 | 01 | 02JAN2020 | 01 | 03JAN2020 | 02 | 01JAN2020 | 02 | 02JAN2020 | 02 | 02JAN2020 | 0

我希望在sas数据集中添加一个序列列,但要根据ID和事务日期。为了举例说明,以下是我所指的表格:

ID   |   TXN_DT    |    
01   |  01JAN2020  |    
01   |  01JAN2020  |    
01   |  02JAN2020  |    
01   |  03JAN2020  |    
02   |  01JAN2020  |    
02   |  02JAN2020  |    
02   |  02JAN2020  |    
02   |  03JAN2020  |    
02   |  03JAN2020  |  
我想添加这样一个序列:

ID   |   TXN_DT    |   SEQ  | 
01   |  01JAN2020  |    1   |
01   |  01JAN2020  |    1   |
01   |  02JAN2020  |    2   |
01   |  03JAN2020  |    3   |
02   |  01JAN2020  |    1   |
02   |  02JAN2020  |    2   |
02   |  02JAN2020  |    2   |
02   |  03JAN2020  |    3   |
02   |  03JAN2020  |    3   |
我试图运行以下代码,但它似乎向上跳了一行,没有复制上一行的值,而是跳到上面的两行

data want;
set have;
by id;
if first.id then seq=1;
else seq+1;
if txn_dt=lag(txn_dt) then seq = lag(seq);
keep id seq txn_dt;
run;
有什么帮助吗?提前谢谢

试试看

if first.id then seq=0;
seq + (first.id or txn_dt ne lag(txn_dt);

尝试先使用
retain

data want(drop=txn_dt_group);
    set have;
    by id txn_dt;
    retain txn_dt_group seq;
    if first.id then do;
        txn_dt_group=txn_dt;
        seq=1;
    end;
    if txn_dt ne txn_dt_group then do;
        seq=seq+1;
        txn_dt_group=txn_dt;
    end;    
run;
输出:

+-----------+----+-----+
|  txn_dt   | ID | seq |
+-----------+----+-----+
| 01JAN2020 |  1 |   1 |
| 01JAN2020 |  1 |   1 |
| 02JAN2020 |  1 |   2 |
| 03JAN2020 |  1 |   3 |
| 01JAN2020 |  2 |   1 |
| 02JAN2020 |  2 |   2 |
| 02JAN2020 |  2 |   2 |
| 03JAN2020 |  2 |   3 |
| 03JAN2020 |  2 |   3 |
+-----------+----+-----+

我认为应该这样做。

为了完整起见,这里有一个不依赖于数据顺序的哈希解决方案

data have;
input ID $ TXN_DT :date9.;
infile datalines dlm='|';
format TXN_DT date9.;
datalines;
01|01JAN2020
01|01JAN2020
01|02JAN2020
01|03JAN2020
02|01JAN2020
02|02JAN2020
02|02JAN2020
02|03JAN2020
02|03JAN2020
;

data want(drop=rc);
   if _N_ = 1 then do;
      dcl hash h1 ();
      h1.definekey ('ID', 'TXN_DT');
      h1.definedata ('SEQ');
      h1.definedone ();
      dcl hash h2 ();
      h2.definekey ('ID');
      h2.definedata ('SEQ');
      h2.definedone ();

      do until (lr);
         set have end=lr;

         if h2.find() = 0 then do;
            if h1.check() ne 0 then seq + 1;
         end;
         else seq = 1;

         h1.ref();
         h2.replace();
      end;
   end;

   set have;
   rc = h1.find();
run;

我可能会稍微改变一下,当
txn_dt^=lag(txn_dt)
data have;
input ID $ TXN_DT :date9.;
infile datalines dlm='|';
format TXN_DT date9.;
datalines;
01|01JAN2020
01|01JAN2020
01|02JAN2020
01|03JAN2020
02|01JAN2020
02|02JAN2020
02|02JAN2020
02|03JAN2020
02|03JAN2020
;

data want(drop=rc);
   if _N_ = 1 then do;
      dcl hash h1 ();
      h1.definekey ('ID', 'TXN_DT');
      h1.definedata ('SEQ');
      h1.definedone ();
      dcl hash h2 ();
      h2.definekey ('ID');
      h2.definedata ('SEQ');
      h2.definedone ();

      do until (lr);
         set have end=lr;

         if h2.find() = 0 then do;
            if h1.check() ne 0 then seq + 1;
         end;
         else seq = 1;

         h1.ref();
         h2.replace();
      end;
   end;

   set have;
   rc = h1.find();
run;