可以将具有 max 函数的 subselect 转换为 SAS 数据步骤吗?
it is possible to convert subselect with max function into SAS datastep?
是否可以将以下代码从 proc sql 转换为 sas datastep?
proc sql;
create table CAL_CHECK as
select t1.DT_REP
, t1.BANK_FLAG
, (select MAX(t2.DT_REP) as LAST_BD_BANK_FLAG from CZ_LOOK.CZ_CALENDAR t2 where t2.DT_REP < t1.DT_REP and t2.BANK_FLAG='Y') as LAST_BD
from CZ_LOOK.CZ_CALENDAR t1
where dt_rep between &first_day. and &last_day.;
quit;
感谢回复
示例:
DT_REP LAST_BD
01.04.2020 31.03.2020
02.04.2020 01.04.2020
03.04.2020 02.04.2020
04.04.2020 03.04.2020
05.04.2020 03.04.2020
06.04.2020 03.04.2020
07.04.2020 06.04.2020
08.04.2020 07.04.2020
1.4。是星期三,所以最后一个银行工作日是 31.3,
5.4.是星期天,所以最后一个银行工作日是 3.4,
6.4.是星期一,所以最后一个银行工作日是 3.4。至
是的。 sub-select 是一个自相关的 sub-selected.
人们可能认为 LAG 是合适的,但是,bank_flag 条件使得无法将 LAG 用于手头的任务。
保留last_bd
并仅更新其值后使用其先前状态的值实质上将根据需要有条件地滞后变量。
示例:
data CZ_CALENDAR;
input (DT_REP LAST_BD) (ddmmyy10.:) bank_flag: . ;
format dt_rep last_bd yymmdd10.;
datalines;
31.03.2020 . Y Tue
01.04.2020 31.03.2020 Y Wed
02.04.2020 01.04.2020 Y Thu
03.04.2020 02.04.2020 Y Fri
04.04.2020 03.04.2020 N Sat
05.04.2020 03.04.2020 N Sun
06.04.2020 03.04.2020 Y Mon
07.04.2020 06.04.2020 Y Tue
08.04.2020 07.04.2020 Y Wed
;
%let first_day = '01JAN2020'D;
%let last_day = "&SYSDATE."D;
%put NOTE: &=first_day;
%put NOTE: &=last_day;
proc sql;
create table CAL_CHECK as
select
t1.DT_REP
, t1.BANK_FLAG
, ( select MAX(t2.DT_REP) as LAST_BD_BANK_FLAG
from CZ_CALENDAR t2
where t2.DT_REP < t1.DT_REP and t2.BANK_FLAG='Y'
)
as LAST_BD
from
CZ_CALENDAR t1
where
dt_rep between &first_day. and &last_day.;
quit;
proc print data=CAL_CHECK;
title "SQL";
format dt_rep last_bd WEEKDATE.;
run;
proc sort data=cz_calendar;
by dt_rep;
data cal_check2(where=(dt_rep between &first_day. and &last_day.));
set cz_calendar;
OUTPUT;
* save dt_rep from most recent bank_flag day;
retain last_bd;
if bank_flag = 'Y' then last_bd = dt_rep;
run;
proc print data=CAL_CHECK2;
title "DATA step";
format dt_rep last_bd WEEKDATE.;
run;
输出
是否可以将以下代码从 proc sql 转换为 sas datastep?
proc sql;
create table CAL_CHECK as
select t1.DT_REP
, t1.BANK_FLAG
, (select MAX(t2.DT_REP) as LAST_BD_BANK_FLAG from CZ_LOOK.CZ_CALENDAR t2 where t2.DT_REP < t1.DT_REP and t2.BANK_FLAG='Y') as LAST_BD
from CZ_LOOK.CZ_CALENDAR t1
where dt_rep between &first_day. and &last_day.;
quit;
感谢回复
示例:
DT_REP LAST_BD
01.04.2020 31.03.2020
02.04.2020 01.04.2020
03.04.2020 02.04.2020
04.04.2020 03.04.2020
05.04.2020 03.04.2020
06.04.2020 03.04.2020
07.04.2020 06.04.2020
08.04.2020 07.04.2020
1.4。是星期三,所以最后一个银行工作日是 31.3,
5.4.是星期天,所以最后一个银行工作日是 3.4,
6.4.是星期一,所以最后一个银行工作日是 3.4。至
是的。 sub-select 是一个自相关的 sub-selected.
人们可能认为 LAG 是合适的,但是,bank_flag 条件使得无法将 LAG 用于手头的任务。
保留last_bd
并仅更新其值后使用其先前状态的值实质上将根据需要有条件地滞后变量。
示例:
data CZ_CALENDAR;
input (DT_REP LAST_BD) (ddmmyy10.:) bank_flag: . ;
format dt_rep last_bd yymmdd10.;
datalines;
31.03.2020 . Y Tue
01.04.2020 31.03.2020 Y Wed
02.04.2020 01.04.2020 Y Thu
03.04.2020 02.04.2020 Y Fri
04.04.2020 03.04.2020 N Sat
05.04.2020 03.04.2020 N Sun
06.04.2020 03.04.2020 Y Mon
07.04.2020 06.04.2020 Y Tue
08.04.2020 07.04.2020 Y Wed
;
%let first_day = '01JAN2020'D;
%let last_day = "&SYSDATE."D;
%put NOTE: &=first_day;
%put NOTE: &=last_day;
proc sql;
create table CAL_CHECK as
select
t1.DT_REP
, t1.BANK_FLAG
, ( select MAX(t2.DT_REP) as LAST_BD_BANK_FLAG
from CZ_CALENDAR t2
where t2.DT_REP < t1.DT_REP and t2.BANK_FLAG='Y'
)
as LAST_BD
from
CZ_CALENDAR t1
where
dt_rep between &first_day. and &last_day.;
quit;
proc print data=CAL_CHECK;
title "SQL";
format dt_rep last_bd WEEKDATE.;
run;
proc sort data=cz_calendar;
by dt_rep;
data cal_check2(where=(dt_rep between &first_day. and &last_day.));
set cz_calendar;
OUTPUT;
* save dt_rep from most recent bank_flag day;
retain last_bd;
if bank_flag = 'Y' then last_bd = dt_rep;
run;
proc print data=CAL_CHECK2;
title "DATA step";
format dt_rep last_bd WEEKDATE.;
run;
输出