楼主: xulimei1986
14693 7

[问答] 如何从一个表,模糊匹配另一个表中的字段 [推广有奖]

  • 3关注
  • 0粉丝

博士生

68%

还不是VIP/贵宾

-

威望
0
论坛币
41 个
通用积分
0
学术水平
3 点
热心指数
8 点
信用等级
3 点
经验
22590 点
帖子
138
精华
0
在线时间
439 小时
注册时间
2012-3-20
最后登录
2019-5-11

楼主
xulimei1986 发表于 2013-12-27 13:34:38 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
如题:
数据集1 :字段A :yanbiantuhao304用户列表与相关信息baseInfoTemplate12345
                           检测更新信息5201858161776108380手机型号ios7.1
数据集2:字段B: 用户列表与相关信息baseInfoTemplate

如果数据集2中的字段在数据1中查到了,则将B字段加入数据1中,否则为空,
结果为:
数据1
A            B
yanbiantuhao304用户列表与相关信息baseInfoTemplate12345     用户列表与相关信息baseInfoTemplate
检测更新信息5201858161776108380手机型号ios7.1  

求各位大神赐教。

二维码

扫码加我 拉你入群

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

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

关键词:Template plate Late Info Base 如何

本帖被以下文库推荐

  • · MyLib|主题: 414, 订阅: 41
家家有本难念的经,计较的少一点,会和睦许多!!

沙发
yongyitian 发表于 2013-12-29 09:12:13
如果数据集 b 是 look-up table, 可以使用 Hash Object Merge
  1. data a;
  2.    length vara $20.;
  3. input vara $;
  4. datalines;
  5. abcMMMMMxyz
  6. 1123XXX0000
  7. 1999yyy0000
  8. 23456ZZZZZZ99999
  9. ; run;

  10. data b;                /* look-up table */
  11.    length varb $20.;
  12. input varb $;
  13. datalines;
  14. MMMMM
  15. ZZZZZZ
  16. ; run;

  17. data c (rename=(varc=varb));
  18.    if 0 then set b;
  19.    length varc $20.;
  20.    if _n_ = 1 then do;
  21.        declare hash hh(dataset: 'b');
  22.        hh.definekey('varb');
  23.        hh.definedata('varb');
  24.        hh.definedone();
  25.        declare hiter hi('hh');
  26.    end;
  27.    do until(eof);
  28.        set a end = eof;
  29.           call missing (varc);
  30.        do rc=hi.first() by 0 while (rc=0);
  31.            if find(strip(vara), strip(varb)) then varc=varb;
  32.            rc=hi.next();
  33.        end;
  34.        output;
  35.    end;
  36. drop rc varb;
  37. run;
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
xulimei1986 + 1 + 1 + 1 好的意见建议

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

藤椅
changgz 发表于 2013-12-29 10:58:47
对楼主的意思不太明白。如果需要模糊匹配的话,spedis()这个函数可以用,不过这个函数计算匹配度是从前往后算的,就是前面的字符约匹配,则模糊匹配出来的值就越小(越小越好)。
但是就楼主的例子而言,直接用Index()函数匹配就可以了,不需要模糊查找。楼主可以举一个别的例子看看吗?

还有,想请教一下,此处为何要使用Hash?
                                                                                                                                       
                                                                                                                                       
data a;                                                                                                                                
length vara $20.;                                                                                                                       
input vara $;                                                                                                                           
datalines;                                                                                                                              
abcMMMMMxyz                                                                                                                             
1123XXX0000                                                                                                                             
1999yyy0000                                                                                                                             
23456ZZZZZZ99999                                                                                                                        
;                                                                                                                                       
run;                                                                                                                                    
                                                                                                                                       
data b;                /* look-up table */                                                                                             
   length varb $20.;                                                                                                                    
input varb $;                                                                                                                           
datalines;                                                                                                                              
MMMMM                                                                                                                                   
ZZZZZZ                                                                                                                                 
; run;                                                                                                                                 
                                                                                                                                       
proc sql;                                                                                                                              
create table c as select vara,varb                                                                                                      
from a,b                                                                                                                                
where index(STRIP(a.vara),STRIP(b.varb))>=1;                                                                                            
quit;                                                                                                                                   
                                                                                                                                       
/*或者*/                                                                                                                                
proc sql;                                                                                                                              
create table c as select vara,varb                                                                                                      
from a                                                                                                                                 
left join b                                                                                                                             
on index(STRIP(a.vara),STRIP(b.varb))>=1;                                                                                               
quit;
已有 3 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
chai_prime + 5 + 1 + 1 观点有启发
xulimei1986 + 1 + 1 + 1 简便易懂,数据量较大的时候,hash效率要高.
yongyitian + 1 + 1 + 1 还是SQL简单些

总评分: 论坛币 + 5  学术水平 + 3  热心指数 + 3  信用等级 + 2   查看全部评分

板凳
yongyitian 发表于 2013-12-29 11:23:33
changgz 发表于 2013-12-29 10:58
对楼主的意思不太明白。如果需要模糊匹配的话,spedis()这个函数可以用,不过这个函数计算匹配度是从前往 ...
上面的 hash join 等同于 sql left join.
如果没有 call missing(varc). 这句, 就是 inner join.
把find()改成index() 可以得到同样的结果.
  1. data ccc1 (rename=(varc=varb));
  2.    if 0 then set b;
  3.    length varc $20.;
  4.    if _n_ = 1 then do;
  5.        declare hash hh(dataset: 'b');
  6.        hh.definekey('varb');
  7.        hh.definedata('varb');
  8.        hh.definedone();
  9.        declare hiter hi('hh');
  10.    end;
  11.    do until(eof);
  12.        set a end = eof;
  13.           call missing (varc);
  14.        do rc=hi.first() by 0 while (rc=0);
  15.            if index(STRIP(vara),STRIP(varb))>=1 then varc=varb;
  16.            rc=hi.next();
  17.        end;
  18.        output;
  19.    end;
  20. drop rc varb;
  21. run;
复制代码

报纸
changgz 发表于 2013-12-29 11:30:14
yongyitian 发表于 2013-12-29 11:23
上面的 hash join 等同于 sql left join.
如果没有 call missing(varc). 这句, 就是 inner join ...
多谢了。
请问在什么情况下会想到使用Hash呢?

地板
yongyitian 发表于 2013-12-29 11:41:07
changgz 发表于 2013-12-29 11:30
多谢了。
请问在什么情况下会想到使用Hash呢?
楼主的数据集2 貌似一个 look-up table.  datastep merge 需要有一个 by variable. 因为没有其他变量,不知如何用 data step merge or update.

7
changgz 发表于 2013-12-29 11:43:40
多谢了

8
eric_darcy 发表于 2018-4-25 23:29:04
[em17][em17][em17][em17][em17][em17][em17][em17]

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-1 10:40