全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2743 5
2013-05-16
有两份数据:
test1:用户登陆数据,有登陆时间 用户名 登陆IP的数据
test2:用户购物数据,有购物时间 用户名 消费金额数据

复制代码


现在需要把两份数据进行合并,如上例中
test2第一行是A用户在1月5号购买物品,需要找到该用户在购买前的最后一次登陆,即test1中的第四行数据,并将IP数据匹配到TEST2表中
再例test2第二行是A用户在1月2号购买物品,需要找到该用户购物前最后一次登陆,即test1中的第一行数据,并将IP数据匹配到TEST2表中

最终的期望结果:
time2 user cost ip

数据量较大,不能用proc sql实现(会卡死),求助大神了。
二维码

扫码加我 拉你入群

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

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

全部回复
2013-5-16 19:09:21
data test1;
  set test1;
  time1=time1+1;
run;
proc sort data=test1;by time1;run;
proc sort data=test2;by time2;run;
data final;
  merge test1(in=in1 rename=(time1=time2)) test2(in=in2);
  by time2;
  if in1 and in2;
run;
二维码

扫码加我 拉你入群

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

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

2013-5-16 20:28:43
Easy if either dataset could be sorted by user id, time
二维码

扫码加我 拉你入群

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

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

2013-5-16 20:54:02
data result;
        if 0 then set test1 test2;
        if _N_ = 1 then do;
            declare hash pt(dataset:"test1", multidata: 'y');
                            pt.defineKey("user");
                            pt.defineData("time1", "ip");
                            pt.defineDone();
        end;

        set test2;
        rc = pt.find();
        if (rc = 0) then BestDistance = 9999;
        do while (rc = 0);
                Distance = time2 - time1;
                if 0 <= Distance < BestDistance then do;
                        BestDistance = Distance;
                        ip_addr = ip;
                        ip_time = time1;
                end;
                rc = pt.find_next();
                if (rc ~= 0) and BestDistance ~= 9999 then output;
        end;

        keep user time2 cost ip_time ip_addr;
        format ip_time mmddyy10.;
run;
二维码

扫码加我 拉你入群

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

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

2013-5-16 21:22:08
邓贵大 发表于 2013-5-16 20:28
Easy if either dataset could be sorted by user id, time
You're right! I got a wrong result.
二维码

扫码加我 拉你入群

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

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

2013-5-16 22:45:23
/* the code may only works for above datasets */
/* for real data, you may need to do some filter on the merged dataset */

proc sort data=test1 out=test1_sort; by user time1; run;
proc sort data=test2 out=test2_sort; by user time2; run;

data test_merge;
     merge test1_sort test2_sort;
         time_dif = time2-time1;
         by user;
         if time_dif >=0;
run;

proc print data=test_merge;
    var user time1 time2 time_dif ip cost;
title 'test_merge'; run;
二维码

扫码加我 拉你入群

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

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

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

说点什么

分享

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