Как ограничить количество месяцев в SAS - PullRequest
0 голосов
/ 01 мая 2018

У меня есть одно имя столбца "месяц", который имеет 31 месяц

я хочу ограничить количество месяцев

например: - текущий месяц, за которым следуют два будущих месяца и 3 предыдущих месяца, за которыми следует текущий месяц

Например, если текущий месяц апрель, он должен показывать что-то вроде

ФЕВРАЛЬ-МАРТ-АПРЕЛЬ (Текущий месяц) -МАЙ- ИЮНЬ

Кто-нибудь знает, как мы можем сделать это в SAS, и оно должно динамически меняться?

Текущий столбец таблицы Месяц (Формат dtdate9.)

01JAN2016 01FEB2016 01MAR2016 01APR2016 01MAY2016 01JUN2016 01JUL2016 01AUG2016 01SEP2016 01OCT2016 01NOV2016 01DEC2016 01JAN2017 01FEB2017 01MAR2017 01APR2017 01MAY2017 01JUN2017 01JUL2017 01AUG2017 01SEP2017 01OCT2017 01NOV2017 01DEC2017 01JAN2018 01FEB2018 01MAR2018 01APR2018 01MAY2018 01JUN2018 01DEC2018

Вывод: - Мне нужны два столбца: максимальная дата и минимальная дата: максимальная дата даст +2, минимальная дата будет равна -3, и для каждого текущего месяца она должна динамически изменяться. Эти два столбца max и min я буду использовать в своем инструменте отчетности SAS VA как месяц между min & max

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Используйте функцию INTNX() для получения определенного диапазона данных (увеличение или уменьшение)

Данные:

data have;
input date ;
informat date date9.;
datalines;
01NOV2017 
01DEC2017 
01JAN2018 
01FEB2018 
01MAR2018 
01APR2018 
01MAY2018 
01JUN2018 
;
run;

Решение:

proc sql;
create table want as
select 
date format=date9. ,
intnx('month',date,-3) as min_date format=date9.,
intnx('month',date,+2) as max_date format=date9.
from have;
quit;

Выход:

date=01NOV2017 min_date=01AUG2017 max_date=01JAN2018
date=01DEC2017 min_date=01SEP2017 max_date=01FEB2018
date=01JAN2018 min_date=01OCT2017 max_date=01MAR2018
date=01FEB2018 min_date=01NOV2017 max_date=01APR2018
date=01MAR2018 min_date=01DEC2017 max_date=01MAY2018
date=01APR2018 min_date=01JAN2018 max_date=01JUN2018
date=01MAY2018 min_date=01FEB2018 max_date=01JUL2018
date=01JUN2018 min_date=01MAR2018 max_date=01AUG2018
0 голосов
/ 01 мая 2018

Если у вас есть табличные данные, вам нужно сделать только два шага:

  1. (необязательный шаг) Сортировка данных по дате, а не по названию месяца PROC SORT
  2. Используйте функцию INTCK() для проверки нужного интервала (в месяце) и date (), которая возвращает сегодняшнюю дату

Фиктивные данные:

data have;
length date 8. month $3. ;
input date month $ ;
informat date anydtdte20.;
format date ddmmyys10.;
datalines;
01/07/2018 JUL
01/02/2018 FEB
01/03/2018 MAR
01/04/2018 APR
01/05/2018 MAY
01/06/2018 JUN
01/08/2018 AUG
01/09/2018 SEP
;
run;

proc sort data=have out=sorted; by date; run;

Решение 1. Использование шага данных

data want;
set sorted;
diff= intck('month',date(),date);
if (diff<= 2 and diff>= -3) then output;
run;

Решение 2. Использование Proc SQL

proc sql;
create table want2 as
select * from sorted
where intck('month',date(),date) between 2 and -3 ;
quit;

Выход:

date=01/02/2018 month=FEB diff=-3 
date=01/03/2018 month=MAR diff=-2 
date=01/04/2018 month=APR diff=-1 
date=01/05/2018 month=MAY diff=0 
date=01/06/2018 month=JUN diff=1 
date=01/07/2018 month=JUL diff=2
...