Последовательности в таблицах SAS - PullRequest
0 голосов
/ 14 февраля 2020

Я хочу добавить столбец последовательности в мой набор данных sas, но в соответствии с идентификаторами и датами транзакций. Для иллюстрации ниже приведена таблица, на которую я ссылаюсь:

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   |

Я пытаюсь запустить следующий код , но кажется, что он подпрыгивает на строку вверх и не копирует предыдущее значение строки, а вместо этого переходит на 2 строки выше.

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;

любая помощь? Заранее спасибо!

Ответы [ 4 ]

1 голос
/ 14 февраля 2020

Попробуйте

if first.id then seq=0;
seq + (first.id or txn_dt ne lag(txn_dt);
0 голосов
/ 18 февраля 2020

Для полноты, вот решение ha sh, которое не зависит от порядка ваших данных.

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;
0 голосов
/ 14 февраля 2020
data want;
set have;
by id txn_dt;
if first.id then seq=1;
else if first.txn_dt then seq+1;
run;

Я думаю, что должен это сделать.

0 голосов
/ 14 февраля 2020

Попробуйте использовать retain и first.

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 |
+-----------+----+-----+
...