SAS中文论坛

标题: 求助:一个比较复杂的数据处理问题 [打印本页]

作者: shiyiming    时间: 2010-8-26 15:54
标题: 求助:一个比较复杂的数据处理问题
请教高手一个复杂的数据处理过程,最好是能用纯SQL脚本实现,这样可以在数据库中运行了,谢谢啊。

需求如下:
(1)已知:数据集1
规则编号        前项产品        后项产品        可信度
1        A&B        C        90%
2        A        D        80%
3        A        C        70%
4        A        E        65%
5        A        F        50%
6        B        A        55%
7        B        C        65%
8        B        D        60%
9        B        E        40%
10        C        D        75%
11        B&C        D        80%
        ……        ……        ……

(2)已知:数据2:
一个客户一个产品一条记录
客户ID        购买产品
1        A
1        B
2        B
2        C
2        D
……        ……

(3)最终结果:
样式:一个客户一条纪录
客户ID        是否购买A        是否购买B        是否购买C        是否购买D        推荐购买产品1        购买可信度1        推荐购买产品2        购买可信度2        推荐购买产品3        购买可信度3
1        1        1        0        0                                               
2        0        1        1        1                                               
……                                                                               

处理说明:
1、数据2的长表转变成最终结果的宽表(用0,1标识是否购买了某个产品)
2、依据数据集1的规则,在数据2的基础上给出每个客户最多3个推荐产品及相应的可信度,计算方法如下:
        第一步:先根据数据2中每个客户购买的产品从数据1中找出满足条件的规则(以客户1为例,即那些前项产品被客户1购买过的规则,也就是有前向产品是A、B、A&B的规则):
规则编号        前项产品        后项产品        可信度
1        A&B        C        90%
2        A        D        80%
3        A        C        70%
4        A        E        65%
5        A        F        50%
6        B        A        55%
7        B        C        65%
8        B        D        60%
9        B        E        40%
        第二步:剔除掉该客户已经购买过的规则(即规则中后项产品已经被购买过的记录),如客户1已经购买过A和B产品,那么就需要剔除第6条规则。
规则编号        前项产品        后项产品        可信度
1        A&B        C        90%
2        A        D        80%
3        A        C        70%
4        A        E        65%
5        A        F        50%
6        B        A        55%
7        B        C        65%
8        B        D        60%
9        B        E        40%
        第三步:对剩下的规则按照可信度进行从高到底排序,如果后项产品有重复的规则只保留可信度最高的那一条。最后筛选出排名前3条的规则(如果满足条件的规则数少于3条,就筛选实际条数的规则):
规则编号        前项产品        后项产品        可信度
1        A&B        C        90%
2        A        D        80%
4        A        E        65%

        第四步:生成最终的推荐产品数据(如果上一步筛选的规则只有2条,那么推荐购买产品3、购买可信度3填空,其他情况也以此类推)。

客户ID        是否购买A        是否购买B        是否购买C        是否购买D        推荐购买产品1        购买可信度1        推荐购买产品2        购买可信度2        推荐购买产品3        购买可信度3
1        1        1        0        0        C        90%        D        80%        E        65%
作者: shiyiming    时间: 2010-9-16 23:55
标题: Re: 求助:一个比较复杂的数据处理问题
[code:1dptkipx]data a;
input r fp $ lp $ rel percent8.0;
cards;
1 A&B C 90%
2 A D 80%
3 A C 70%
4 A E 65%
5 A F 50%
6 B A 55%
7 B C 65%
8 B D 60%
9 B E 40%
10 C D 75%
11 B&C D 80%
;
data b;
input id p $;
cards;
1 A
1 B
2 B
2 C
2 D
;
run;
proc sort data=b;
by id p;
run;
data b1(drop=p);
set b;
  by id p;
   if first.id then do;
    fa='';fb='';fc='';fd='';
    retain fa  fb  fc  fd ;
   end;
    if p='A' then fA=1;
     else if p='B' then fB=1;
      else if p='C' then fC=1;
       else if p='D' then fD=1;
   if last.id=1;
RUN;

proc sql;
create table a1 as
   select *
     from (select *,max(rel) as max_rel,(max(rel)=rel) as m_r
             from a
            where fp in (select p from b where id=1)
               or (substr(fp,1,1) in (select p from b where substr(fp,2,1)='&' and id=1)
              and substr(fp,3,1) in (select p from b where substr(fp,2,1)='&' and id=1))
            group by lp)
    order by max_rel desc,lp,rel desc;
quit;

data a2(drop=max_rel m_r rank); set a1; by descending max_rel  lp descending rel ;
rank+m_r;
  if rank<=3 and first.lp;
run;

data a3(drop=r fp lp rel); retain id 1;set a2; retain lc relc ld reld le rele;
     if lp='C' then do; lc=lp; relc=rel; end;
       if lp='D' then do; ld=lp; reld=rel; end;
        if lp='E' then do; le=lp; rele=rel; end;
                if _n_=3;
run;

proc sql;
create table final as
  select b1.*,a3.*
    from b1 left join a3
         on b1.id=a3.id
   where b1.id=a3.id;
quit;[/code:1dptkipx]




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2