有两张表, 表A
| StockID | Sn | date |
| 000001 | 1 | 2000-01-02 |
| 000001 | 2 | 2000-01-04 |
| 000001 | 3 | 2000-01-05 |
| 000002 | 1 | 1998-03-01 |
| 000002 | 2 | 1998-03-02 |
| 000002 | 3 | 1998-03-03 |
第一列为股票代码,第二列为序号,每只股票都从1编号,第三列为交易日期。
表B
| StockID | date |
| 000001 | 2000-01-03 |
| 000002 | 1998-03-03 |
程序需求:得出表B中每一条观测对应表A中股票代码相同日期相同的记录的序号(SN),如果没有对应相同的日期,则取A表中比该日期靠后且离它最近的日期的记录的序号(SN),例如B中000001股票的公告时间是2000-01-03,由于是周末,A表中不存在对应的交易时间,那么就取2000-01-04那天的序号。预期结果如下
表C(预期结果)
| number | StockID | date |
| 2 | 000001 | 2000-01-03 |
| 3 | 000002 | 1998-03-03 |
然而我用程序得到的结果是
表C(实际结果)
| number | StockID | date |
| 3 | 000001 | 2000-01-03 |
| 3 | 000002 | 1998-03-03 |
对应序号都变成3。我把程序贴出来请大家指教错在哪里,如何更改。
data A;
input stockid$ sn date yymmdd10.;
cards;
000001 1 2000-01-02
000001 2 2000-01-04
000001 3 2000-01-05
000002 1 1998-03-01
000002 2 1998-03-02
000002 3 1998-03-03
;
run;
data B;
input stockid$ date yymmdd10.;
cards;
000001 2000-01-03
000002 1998-03-03
;
run;
%let stkid = 000000;
%let b_date = 0;
%let number = 0;
%Macro formCarData;
proc sql;
create table temp as
select * from A where stockid = "&stkid";
data temp;
set temp;
if date >= &b_date then do;
call symput("number", sn);
stop;
end;
run;
%Mend formCarData;
data C;
set B;
CALL SYMPUT("stkid", stockid);
CALL SYMPUT("b_date", date);
call execute('%formCarData;');
number = symget("number");
run;