SAS Подсчет количества изменений между последовательными периодами времени - PullRequest
0 голосов
/ 07 января 2019

Proc SQL Version = 9.4. Нет функций для использования Windows.

Идентификатор клиента, период времени (месяц), сумма и соответствующий класс.

client_id   data_period       amount    class 

1           200801            30000     2
2           200801            17000     1
3           200801            9000      1
1           200802            30000     2
2           200802            55555     2
3           200802            11000     2

Пороговая сумма = 20 000.

сумма> 20к дает класс = 2 , количество <= 20к составляет <strong>класс = 1

client_id = 1, количество и класс одинаковы для 200801 и 200802. client_id = 2, сумма увеличивается с 17k до 55,5k, изменение класса корректно, с 1 до 2. client_id = 3, сумма изменилась в том же классе 1 (<20K), но класс изменился неправильно. </p>

Желаемый результат:

client_id   oldDate   newDate   AmtOld    AmtNew   ClassOld ClassNew  Good Bad
    2        200801   200802    17000     55555    1        2         1    0
    3        200801   200802     9000     11000    1        1         0    1

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

client_id oldDate newDate AmtOld      AmtNew   ClassOld ClassNew

A001687463 200808 200802 -5613        1690386  I03      I04
A001687463 200807 200802 -5613        1690386  I03      I04
A001687463 200806 200802 -5613        1690386  I03      I04
A001687463 200805 200802 -5613        1690386  I03      I04 

PROC SQL;
   CREATE TABLE WORK.'Q'n AS 

   SELECT distinct

t1.client_id, t1.data_period as oldDate, t2.data_period as newDate, t1.amount as expAmtOld, t2.amount as expAmtNew, t1.class as classOld, t2.class as classNew

   FROM WORK.'E'n t1,  WORK.'E'n t2
   where
    t1.client_id = t2.client_id and 
    t1.amount <> t2.amount
    order by t1.client_id;

1 Ответ

0 голосов
/ 07 января 2019

Не пытайтесь выполнять последовательную обработку с использованием SQL. Он не построен для этого.

Это должно быть легко сделать в шаге данных. Например, давайте конвертируем вашу распечатку в фактический набор данных SAS, чтобы у нас было что кодировать.

data have ;
  input client_id data_period amount class ;
cards;
1 200801 30000 2
2 200801 17000 1
3 200801 9000  1
1 200802 30000 2
2 200802 55555 2
3 200802 11000 2
;

И давайте разберем его по клиенту и периоду.

proc sort data=have ;
  by client_id data_period ;
run;

Теперь просто установите данные и используйте функцию LAG (), чтобы получить предыдущие значения. Не уверен, что вы определили GOOD и BAD, поэтому я просто создал новые переменные класса, основываясь на вашем правиле 20K.

data want ;
  set have ;
  by client_id;
  old_period = lag(data_period);
  old_class = lag(class);
  newclass = 1 + (amount > 20000) ;
  old_newclass = lag(newclass);
  if first.client_id then call missing(of old_:);
  bad = (class ne newclass) or (old_newclass ne old_class) ;
run;

Итак, вот результаты.

client_     data_                        old_      old_                  old_
   id      period    amount    class    period    class    newclass    newclass    bad

   1       200801     30000      2           .      .          2           .        0
   1       200802     30000      2      200801      2          2           2        0
   2       200801     17000      1           .      .          1           .        0
   2       200802     55555      2      200801      1          2           1        0
   3       200801      9000      1           .      .          1           .        0
   3       200802     11000      2      200801      1          1           1        1
...