楼主: hnmjx
2416 6

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

  • 0关注
  • 0粉丝

大专生

61%

还不是VIP/贵宾

-

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

楼主
hnmjx 发表于 2013-11-21 17:10:32 |AI写论文

+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
拉您进交流群
GMT+8, 2025-12-20 09:21