楼主: hnmjx
2192 6

如何提高效率拼接数据? [推广有奖]

  • 0关注
  • 0粉丝

大专生

61%

还不是VIP/贵宾

-

威望
0
论坛币
122 个
通用积分
0
学术水平
0 点
热心指数
1 点
信用等级
0 点
经验
563 点
帖子
72
精华
0
在线时间
44 小时
注册时间
2012-10-6
最后登录
2024-3-22

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
我有两个表,需要并接。
第一个表内变量n1,n2,n3,n4,n5,n6 第二个表内变量n。(变量数据类型一致)
现在需要并接两个表,第一个表为准,第一个表内n1~n6,只要有一个等于第二个表内n,就并接。
现在我用sql 左连接,可是数据量大,效率很低,这一步需要运行10分钟。
希望有高手提供高效的并接方法。

谢谢

二维码

扫码加我 拉你入群

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

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

关键词:如何提高 高效率 数据类型 sql 拼接 如何

本帖被以下文库推荐

沙发
soporaeternus 发表于 2013-11-22 11:38:18 |只看作者 |坛友微信交流群
表2 hash
Let them be hard, but never unjust

使用道具

藤椅
邓贵大 发表于 2013-11-22 11:52:00 |只看作者 |坛友微信交流群
assuming n is unique in the 2nd table
  1. data a;
  2.         do id=1 to 10000;
  3.                 array n[6];
  4.                 do _n_=1 to dim(n);
  5.                         n[_n_] = ceil(20000*ranuni(12345));
  6.                 end;
  7.                 output;
  8.         end;
  9.         stop;
  10. data b;
  11.         do _n_=1 to 10000;
  12.                 n = ceil(20000*ranuni(54321));
  13.                 output;
  14.         end;
  15.         stop;
  16. proc sort data=b nodupkey;
  17.         by n;

  18. proc sql;
  19. create table c as
  20.         select a.*, b.n
  21.                 from a left join b
  22.                         on (b.n-a.n1)*(b.n-a.n2)*(b.n-a.n3)*(b.n-a.n4)*(b.n-a.n5)*(b.n-a.n6)=0;
  23. quit;

  24. data d;
  25.         set a;
  26.         if _n_=1 then do;
  27.                 if 0 then set b;
  28.                 declare hash _ht(dataset:'b', hashexp:16);
  29.                 _ht.definekey('n');
  30.                 _ht.definedata('n');
  31.                 _ht.definedone();
  32.         end;
  33.         array _x[*] n1-n6;
  34.         array _y[6] _n1-_n6;
  35.         found = 0;
  36.         do i=1 to dim(_x);
  37.                 if _ht.find(key: _x[i])=0 then do;
  38.                         found=found+1;
  39.                         _y[found] = n;
  40.                 end;
  41.         end;
  42.         if found=0 then do;
  43.                 call missing(n);
  44.                 output;
  45.         end;
  46.         else do;
  47.                 n = _y[1];
  48.                 output;
  49.                 do i=2 to found;
  50.                         if index(peekclong(addrlong(_y[1]), 8*(i-1)), put(_y[i], rb8.)) = 0 then do;
  51.                                 n = _y[i];
  52.                                 output;
  53.                         end;
  54.                 end;
  55.         end;
  56.         drop i found _n1-_n6;
  57. run;

  58. proc sort data=c;
  59.         by id n;
  60. proc sort data=d;
  61.         by id n;
  62. proc compare base=c(keep=id n) compare=d(keep=id n);
  63. run;
复制代码
The hash object in the big data step can be replaced with a format.
Alternatively, not quite as efficient but acceptable
  1. proc sql;
  2. create table e as
  3.         select a.*, b1.n as _n1, b2.n as _n2, b3.n as _n3, b4.n as _n4, b5.n as _n5, b6.n as _n6
  4.                 from a left join b as b1 on a.n1=b1.n
  5.                         left join b as b2 on a.n2=b2.n
  6.                         left join b as b3 on a.n3=b3.n
  7.                         left join b as b4 on a.n4=b4.n
  8.                         left join b as b5 on a.n5=b5.n
  9.                         left join b as b6 on a.n6=b6.n
  10.                         ;
  11. quit;
  12. data e;
  13.         set e;
  14.         array _y[*] _n1-_n6;
  15.         if n(of _y[*])=0 then output;
  16.         else do _n_=1 to dim(_y);
  17.                 if _y[_n_] ne . then do;
  18.                         n = _y[_n_];
  19.                         output;
  20.                 end;
  21.         end;
  22.         drop _n1-_n6;
  23. proc sort data=e nodupkey;
  24.         by id n;
  25. proc compare base=c compare=e;
  26. run;
复制代码
Tweak the code above if n is not unique
Be still, my soul: the hour is hastening on
When we shall be forever with the Lord.
When disappointment, grief and fear are gone,
Sorrow forgot, love's purest joys restored.

使用道具

板凳
hnmjx 发表于 2013-11-23 07:39:06 来自手机 |只看作者 |坛友微信交流群
hash对表的观测数量有限制的吧,不能太多。
我想知道有没有data数据步可以实现同样功能性
数据步效率高

使用道具

报纸
吕小布韦 发表于 2013-11-24 11:46:27 |只看作者 |坛友微信交流群
有没有这种情况, 表二第一个观测的n和表一第一个观测的n1相等, 也和第二个观测的n5相等. 这样的话, 表二中一条观测就要和表一中一条观测匹配两次. 或者, 表一中第一个观测的两个变量n1 n2分别和表二的第一个观测, 第三个观测相等, 这样就要表一同一条观测和表二的两条观测匹配两次?

使用道具

地板
hnmjx 发表于 2013-11-25 18:58:26 来自手机 |只看作者 |坛友微信交流群
没有。n1不会等于N2~N5

使用道具

7
hnmjx 发表于 2013-11-25 22:05:17 |只看作者 |坛友微信交流群
我是用
proc sql;
create table t as
select
a.*,b.*
on a.n1=b.n or a.n2=b.n or a.n3=b.n or a.n4=b.n or a.n5=b.n;
quit;
结果提示我无法优化的catersian产品链接。
这段代码运行了10分钟。真受不了

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-1 14:40