全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
1072 4
2013-05-08
有两张表,                                                   表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;







二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2013-5-8 15:45:14
Your raw data is diffrent from the data in your data step,pls check!
You can try this way below as an alternative:
proc sql;
  create table C as
  select A.*
  from A,B
  where A.date=B.date;
quit;
proc print;
  format date yymmdd10.;
  var sn stockid date;
run;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-5-8 16:14:29
谢谢boe,我刚才把需求重新修改了下,在这种情况下就不能用join了,改如何做呢?
我原来的思路很简单,在data步中对于B中的每条记录取出stockid,和日期date,然后在宏formCarData里做两步

第一步:
    用sql语句从A表中筛选出所有特定股票代码的股票。

第二步:
    把筛选出来的股票用data步逐一读出记录,然后比对时间,如果比对正确则把序号放到宏变量number 中传给外面的data步。
但为什么会有错呢。

我感觉到sas的宏虽然从形式上类似与普通编程语言(如C, java等)的函数(或方法),但是我用了几次之后感觉到运行方式似乎大相径庭,感觉sas宏很不灵活,而且会出一些莫名其妙的错误,用一般的程序语言逻辑解释不通。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-5-8 17:29:30
我没有运行你的代码,没有正确结果可能是data A中最后一行数据你输入有误。
下面是新需求的代码:
proc sort data=A;by stockid descending date;run;
proc sort data=B;by descending date ;run;
data C;
  merge A(in=ina) B(in=inb);
  by stockid descending date;
  snlag=lag(sn);
  datelag=lag(date);
  format datelag yymmdd10.;
  if sn=. then do;
    sn=snlag;
        date=datelag;
  end;
  if inb;
  drop snlag datelag;
run;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-5-8 18:48:21
通过,谢谢。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群