#sas
#sas
Вопрос:
У меня есть следующие данные:
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
Теперь, если клиент приобрел какой-либо товар в том же месяце для бывшего клиента, купившего автомобиль 01 января и велосипед 15 января, тогда я хочу, чтобы два классифицировали клиента a как нового за январь для одного отчета, а в другом отчете я хочу, чтобы клиент a был как новым, так и постоянным.
Я пытаюсь, но не понимаю логики —
proc sql;
select a.*,(select count(name) from t where intnx("month",-12,a.date) >= 356)
as tot
from t a;
Quit;
Ответ №1:
Похоже, вам нужны две разные переменные ‘status’, одна для непрерывности по сравнению с предыдущим годом и одна для непрерывности в течение,, месяца.
В SQL результатом экзистенциального рефлексивно коррелированного подзапроса может быть проверка прецедентов для строк, удовлетворяющих критериям over и within. Арифметика даты используется для вычисления дней с интервалом и INTCK
используется для вычисления месяцев с интервалом:
data have; input
customer $ dateamp; date9. itemamp; $; 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;
Ответ №2:
Вы можете использовать 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 |
-------- ----------- ------ --------