如何限制 SAS 中的月数
How to limit number of Months in SAS
我有一个列名 "month" 有 31 个月
我想做的是我想限制月数
例如:- 当前月份后接两个未来月份,前 3 个月后跟当前月份
如果当前月份是四月,那么它必须显示类似
的内容
FEb-MAR-APR(当月)-MAY-JUN
任何人都知道,我们如何在 SAS 中做到这一点并且它应该动态变化?
当前 table 列月份(格式 dtdate9.)
2016 年 1 月 1 日
01FEB2016
2016年03月01日
2016年4月1日
2016年5月1日
01JUN2016
2016年7月1日
01AUG2016
01SEP2016
2016年10月1日
01NOV2016
01DEC2016
2017年1月1日
01FEB2017
2017年3月1日
2017年4月1日
2017年5月1日
01JUN2017
2017年7月1日
01AUG2017
01SEP2017
01OCT2017
01NOV2017
01DEC2017
2018年1月1日
01FEB2018
01MAR2018
2018年4月1日
2018年5月1日
01JUN2018
2018 年 12 月 1 日
输出:- 我需要两列最大日期和最小日期:最大日期将为 +2,最小日期将为 -3,并且对于当前的每个月,它都应该动态变化。最大和最小这两列我将在我的报告工具 SAS VA 中用作最小和最大之间的月份
提前致谢
如果你有表格数据那么你只需要做两个步骤:
- (可选步骤)按日期而非月份名称对数据排序
PROC SORT
- 使用
INTCK()
函数来检查你想要的间隔(以月为单位)和date()returns今天的日期
虚拟数据:
data have;
length date 8. month . ;
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
使用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
我有一个列名 "month" 有 31 个月
我想做的是我想限制月数
例如:- 当前月份后接两个未来月份,前 3 个月后跟当前月份
如果当前月份是四月,那么它必须显示类似
的内容FEb-MAR-APR(当月)-MAY-JUN
任何人都知道,我们如何在 SAS 中做到这一点并且它应该动态变化?
当前 table 列月份(格式 dtdate9.)
2016 年 1 月 1 日 01FEB2016 2016年03月01日 2016年4月1日 2016年5月1日 01JUN2016 2016年7月1日 01AUG2016 01SEP2016 2016年10月1日 01NOV2016 01DEC2016 2017年1月1日 01FEB2017 2017年3月1日 2017年4月1日 2017年5月1日 01JUN2017 2017年7月1日 01AUG2017 01SEP2017 01OCT2017 01NOV2017 01DEC2017 2018年1月1日 01FEB2018 01MAR2018 2018年4月1日 2018年5月1日 01JUN2018 2018 年 12 月 1 日
输出:- 我需要两列最大日期和最小日期:最大日期将为 +2,最小日期将为 -3,并且对于当前的每个月,它都应该动态变化。最大和最小这两列我将在我的报告工具 SAS VA 中用作最小和最大之间的月份
提前致谢
如果你有表格数据那么你只需要做两个步骤:
- (可选步骤)按日期而非月份名称对数据排序
PROC SORT
- 使用
INTCK()
函数来检查你想要的间隔(以月为单位)和date()returns今天的日期
虚拟数据:
data have;
length date 8. month . ;
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
使用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