全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2253 9
2016-06-05

各位高手,
如下表所示,请问如何根据B判断A中的weight是多少呢?依据是日期。

另外,B是不断更新的,请问如何做到以后更新B的时候不需要更新code呢?

谢谢!


数据集A:
dateweight

1997/4/16

2001/9/23



数据集B:
startdateenddateweight

1901/1/1

2000/7/5

1

2000/7/6

2002/8/21

1.007

2002/8/22

2003/6/22

1.526


二维码

扫码加我 拉你入群

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

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

全部回复
2016-6-5 20:02:06
无奈弄了个无条件连接(笛卡尔连接)A和B,再依据begindate<date<enddate判断weight。
然后再删掉A中date重复的记录,只保留符合begindate<date<enddate的记录。

就是笛卡尔连接以后数据集特别大。而且感觉很傻的方法。

感觉宏和宏交互完全没问题,宏和数据集交互有symput symget resove call execute等好像也OK,但是数据集和数据集的交互就无能为力了。
不知道各位高手有什么好方法。
二维码

扫码加我 拉你入群

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

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

2016-6-5 20:07:33
另外一点就是可以在A中增加一列将日期归类为和B一样,然后依据日期连接。
但这样的话,以后B日期更新的时候,AA中增加一列的语句也要同步更新。而上面的方法不需要更新。

A中增加一列:
if date_1<date<date_2 then do; begindate=date_1; enddate=date_2;
else if date_3<date<date_4 then do; begindate=date_3; enddate=date_4;
二维码

扫码加我 拉你入群

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

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

2016-6-6 17:26:30
我的做法是将B从startdate到enddate每天都输出一条,然后AB按日期连接。
二维码

扫码加我 拉你入群

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

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

2016-6-7 09:01:10
keym86 发表于 2016-6-6 17:26
我的做法是将B从startdate到enddate每天都输出一条,然后AB按日期连接。
请问具体的做法?想看看效率。
二维码

扫码加我 拉你入群

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

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

2016-6-7 10:46:39
data a;
        length date $15;
        input date $  ;
        date=cats(date);
cards;
        1997/4/16
        1994/1/2
        2001/9/23
        1999/8/23
        ;
run;

data b;
        length datesd dateen weight $15;
        input datesd$ dateen$ weight$;
cards;
        1994/1/1 1998/1/1 100
        1998/1/2 2000/1/1 99
        2000/1/2 2002/2/2 88
        ;
run;

proc sql noprint;
        create table aabb as
        select a.*,b.weight
        from a left join b
        on a.date between b.datesd and b.dateen;
quit;

感觉笛卡尔积是避免不了的。。。不知道有没有其他方法,不过这样可以避免你join后还去delete。。。仅供参考。。。
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

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