楼主: sun5008
6050 7

[有偿编程] 提问:关于SAS update更新表数据的问题 [推广有奖]

  • 0关注
  • 0粉丝

已卖:993份资源

博士生

45%

还不是VIP/贵宾

-

威望
0
论坛币
96 个
通用积分
2.1000
学术水平
0 点
热心指数
2 点
信用等级
0 点
经验
6239 点
帖子
140
精华
0
在线时间
270 小时
注册时间
2006-3-9
最后登录
2025-11-25

楼主
sun5008 发表于 2014-4-17 10:03:19 |AI写论文
95论坛币
请看下面这个程序;
我用sql更新了a表的2列数。

但这个写法的问题在于:两个表重新join了2次(更新b列join了一次,更新c列又join了一次),大大降低了程序的效率,
谁知道有什么好的写法,能一次更新多列数据进去?
(请注意有个要求,因为我的A表是个很大的主表,都做好了索引,所以A表不能动,一定要保留)
data a;
input a b c;
cards;
1 2 3
2 3 4
4 5 6
;
run;
data b;
input x y z;
cards;
1 55 55
2 66 88
;
run;
proc sql;
        update a
        set b=(select y from b where b.x=a.a),
            c=(select z from b where b.x=a.a)
        ;quit;

关键词:update date PDA ATE upd where update

沙发
zhengbo8 发表于 2014-4-17 20:01:21
  1. data a;
  2.         input xx yy zz;
  3. datalines;
  4. 1 2 3
  5. 2 3 4
  6. 4 5 6
  7. ;
  8. run;

  9. data b;
  10.         input x y z;
  11. datalines;
  12. 1 55 55
  13. 2 66 88
  14. ;
  15. run;

  16. data a;
  17.         update a(rename=(xx=x yy=y zz=z)) b updatemode=nomissingcheck;
  18.         by x;
  19. run;
复制代码

藤椅
sun5008 发表于 2014-4-18 20:23:04
zhengbo8 发表于 2014-4-17 20:01
你好 你的方法确实是个好方法,但是还有个问题

因为我的主表是个很大的表,是带有索引的,
用data步 update以后发现索引没有了

看看能不能在sql的环境里解决呢?

板凳
zhengbo8 发表于 2014-4-18 20:52:54
sun5008 发表于 2014-4-18 20:23
你好 你的方法确实是个好方法,但是还有个问题

因为我的主表是个很大的表,是带有索引的,
方法一:Merge。
  1. data a;
  2.         input xx yy zz;
  3. datalines;
  4. 1 2 3
  5. 2 3 4
  6. 4 5 6
  7. ;
  8. run;

  9. data b;
  10.         input x y z;
  11. datalines;
  12. 1 55 55
  13. 2 66 88
  14. ;
  15. run;

  16. proc sort data=a;by xx;run;
  17. proc sort data=b;by x;run;

  18. data result;
  19.         
  20.         merge a(in=ina) b(rename=(x=xx y=yy z=zz) in=inb);
  21.         by xx;
  22.         if ina;
  23. run;
复制代码
方法二:SQL。
  1. data a;
  2.         input xx yy zz;
  3. datalines;
  4. 1 2 3
  5. 2 3 4
  6. 4 5 6
  7. ;
  8. run;

  9. data b;
  10.         input x y z;
  11. datalines;
  12. 1 55 55
  13. 2 66 88
  14. ;
  15. run;

  16. proc sql noprint ;
  17.         
  18.         create table result as
  19.         select a.xx,
  20.         case when (b.y is not null and b.z is not null) then b.y
  21.         else a.yy end as yy,
  22.         case when (b.y is not null and b.z is not null) then b.z
  23.         else a.zz end as zz
  24.         from a left join b
  25.         on a.xx=b.x;

  26. quit;
复制代码
已有 1 人评分论坛币 收起 理由
admin_kefu + 50 热心帮助其他会员

总评分: 论坛币 + 50   查看全部评分

报纸
sun5008 发表于 2014-4-21 08:42:25
zhengbo8 发表于 2014-4-18 20:52
方法一:Merge。方法二:SQL。
你好  你的程序写法我还是用不了,

因为A是我的一个主表,索引什么都做好了,所以不能动,不能用Create的步骤来做,
只能在原表的基础上Update,用Merge也会破坏主表的索引,而且Merge之前的sort步,对于很大数据量的主表来说是承受不起的

地板
zhengbo8 发表于 2014-4-21 09:11:51
sun5008 发表于 2014-4-21 08:42
你好  你的程序写法我还是用不了,

因为A是我的一个主表,索引什么都做好了,所以不能动,不能用Creat ...
方法二呢?

7
sun5008 发表于 2014-4-21 10:19:19
zhengbo8 发表于 2014-4-21 09:11
方法二呢?
方法2一样的  因为你重新创建了result表  我的A表是不能动的

8
zhengbo8 发表于 2014-4-21 10:47:46
那您直接把result改为a,直接在a上操作。

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

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