У меня есть такой набор данных:
DATA try;
INPUT month :DATE9. account_id mob;
FORMAT month DATE9.;
DATALINES;
01JAN2004 11 9
01FEB2004 11 10
01MAR2004 11 11
01JUN2008 11 0
01JAN2005 12 -1
01FEB2005 12 -1
01MAR2005 12 0
01APR2005 12 1
01MAY2005 12 2
01JUN2005 12 3
01DEC2006 12 0
;
RUN;
Я хочу создать переменную origination_date
, например, минимальную month - mob
дату для учетных записей, для которых сначала (отсортировано по account_id, month) mob
равно выше 0 и минимально month
, где mob=0
для счетов, для которых первый mob
меньше или равен 0.
Ожидаемый результат поэтому будет:
DATA output;
INPUT month :DATE9. account_id mob origination_date :DATE9.;
FORMAT month DATE9. origination_date DATE9.;
DATALINES;
01JAN2004 11 9 01APR2003
01FEB2004 11 10 01APR2003
01MAR2004 11 11 01APR2003
01JUN2008 11 0 01APR2003
01JAN2005 12 -1 01MAR2005
01FEB2005 12 -1 01MAR2005
01MAR2005 12 0 01MAR2005
01APR2005 12 1 01MAR2005
01MAY2005 12 2 01MAR2005
01JUN2005 12 3 01MAR2005
01DEC2006 12 0 01MAR2005
;
RUN;
Пока у меня есть этот код:
proc sql;
create table wanted as
select a.*,
coalesce( min(case when a.mob = 0 then a.month else . end),
min(intnx('month', a.month, -a.mob)) ) as origination_date format date9.
from try a
group by account_id
order by account_id, month;
quit;
Но это не работает для учетной записи с account_id = 11, потому что я не знаю, как добавить условие для первого mob
: первое mob
ниже или равно нулю. Знаете ли вы, как я могу достичь этого в proc sql
? В основном, Я только хочу изменить код так, чтобы min(case when a.mob = 0 then a.month else . end)
применялся только для учетных записей с первым mob
ниже или равным нулю.