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