Proc sql: новые и постоянные клиенты на основе периода оглядки назад - PullRequest
0 голосов
/ 04 марта 2019

У меня есть следующие данные:

wei 01feb2018    car
wei 02feb2018    car
wei 02mar2019    bike
carlin 01feb2018 car
carlin 05feb2018 bike
carlin 07mar2018 bike
carlin 01mar2019 car

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

wei 01feb2018    car     new
wei 02feb2018    car     cont.
wei 02mar2019    bike    new
carlin 01feb2018 car     new
carlin 05feb2018 bike    cont.
carlin 07mar2018 bike    cont.
carlin 01mar2019 car     new

Теперь, если клиент приобрел какой-либо товар в том же месяце для бывшего клиента, приобрел автомобиль на 01jan и велосипед на 15jan, то я хочу, чтобы два клиента классифицировались как новые для Jan дляодин отчет и другой отчет. Я хочу, чтобы клиент А был как новым, так и продолженным.

Я пытаюсь, но не понимаю логику -

proc sql;
select a.*,(select count(name) from t where intnx("month",-12,a.date) >= 356) 
as tot
from t a;
Quit;

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

По-видимому, вам нужны две разные переменные состояния, одна для преемственности за в предыдущем году и одна для преемственности в течение месяца.

В SQL экзистенциальный рефлексивкоррелированный результат подзапроса может быть тематическим тестом для строк, удовлетворяющих критериям более и в пределах .Арифметика даты используется для вычисления дней, а INTCK используется для вычисления месяцев:

data have; input
customer $ date& date9. item& $; format date date9.; datalines;
wei     01feb2018  car
wei     02feb2018  car
wei     02mar2019  bike
carlin  01feb2018  car
carlin  05feb2018  bike
carlin  07mar2018  bike
carlin  01mar2019  car
run;

proc sql;
  create table want as
  select *,
    case
      when exists 
      (
        select * from have as inner 
        where inner.customer=outer.customer
          and (outer.date - inner.date) between 1 and 365
      ) 
      then 'cont.'
      else 'new'
    end as status_year,
    case
      when exists 
      (
        select * from have as inner 
        where inner.customer=outer.customer
          and outer.date > inner.date
          and intck ('month', outer.date, inner.date) = 0
      ) 
      then 'cont.'
      else 'new'
    end as status_month
  from have as outer
  ;
quit;
0 голосов
/ 04 марта 2019

Вы можете использовать retain:

proc sort data=test out=test2;
  by name  type date;
run;

data test2 ;
set test2;
 retain retain 'new';
 by name  type date;
   if first.type then retain='new';
   else retain='con';
run;

proc sort data=test2 out=test2;
  by name  date; 
run;

Выход:

+--------+-----------+------+--------+
|  name  |   date    | type | retain |
+--------+-----------+------+--------+
| carlin | 01FEB2018 | car  | new    |
| carlin | 05FEB2018 | bike | new    |
| carlin | 01MAR2019 | car  | con    |
| wei    | 01FEB2018 | car  | new    |
| wei    | 02FEB2018 | car  | con    |
| wei    | 02MAR2019 | bike | new    |
+--------+-----------+------+--------+
...