2017-03-16 66 views
0

我有我试图通过可变C.以UDPATE在B在A中与记录记录的主设备A和事务组B.SAS更新了多个记录由

DATA TEST; 
    UPDATE A B; 
    BY C; 
RUN; 

的问题是,我在我的主设置中有一些重复的记录,我仍然想要全部更新它们。但我得到的是一个警告

有指定的按组

而且只有第一个记录了这些重复的被更新的多个记录。 有什么办法如何告诉SAS来更新所有的人? 还是有其他的,完全不同的方式?

任何帮助表示赞赏。

+0

张贴一些样本数据。如果表A不是变量C,那么表A的唯一标识符是什么?你想替换C中的变量的值吗?或者当B的变量缺少值时,是否希望保留来自A的原始值而不是将该值设置为缺失。 – Tom

+0

问题是我在表中的唯一密钥基于变量C和D.但是我只有在我的transactioni表变量C。这就是为什么我只用C来更新它。 – puk789

+0

正如SAS文档所述:如果主数据集中存在重复项,则只会更新第一个匹配项,因为生成的WHERE语句始终会在主数据库中查找第一个匹配项。但我真的希望有另一种方式。 – puk789

回答

1

如果您创建用于您更新ID变量的指数,你可以使用modify语句做到这一点。这应该是比,因为它避免了创建主表的临时副本使用update语句快得多 - 但是,如果数据步骤中断有数据损坏的风险。语法有点笨拙,但如果有必要,它可能会被宏观化。

data master; 
input ID1 ID2 VAR1 VAR2; 
cards; 
1 1 2 3 
1 2 3 4 
2 1 5 6 
; 
run; 

data transaction; 
input ID1 VAR1 VAR2; 
cards; 
1 7 8 
; 
run; 

proc datasets lib =work nolist nodetails; 
modify master; 
index create ID1; 
quit; 

data master; 
set transaction(rename = (VAR1 = t_VAR1 VAR2 = t_VAR2)); 
do until(eof); 
    modify master key = ID1 end = eof; 
    if _IORC_ then _ERROR_ = 0; 
    else do; 
     VAR1 = t_VAR1; 
     VAR2 = t_VAR2; 
     replace; 
    end; 
end; 
drop t_VAR1 t_VAR2; 
run; 
+0

真棒,正是我在找的东西。谢谢! – puk789

+0

所以这是一个合并而不是更新? – Tom

1

如果你真的想申请交易然后展开您的交易文件,以具有关键变量C,d对于C的它包含的值的所有可能的值。

proc sql ; 
    create table transactions as 
    select a.D,b.* 
    from A right join B 
    on a.C = b.C 
    order by b.C,a.D 
    ; 
quit; 

然后进行更新。

data want ; 
    update A transactions ; 
    id c d; 
run; 

如果您尝试使用MERGE,那么当两个表中存在额外的变量时您将遇到麻烦。 SAS只会为每个C的值更改第一条记录的值。您可以通过重命名B数据集中的变量来编程。然后,您可以明确地编码是否希望该操作像MERGE或UPDATE一样。所以

data want; 
    merge a b(in=inb rename=(e=new_e)) ; 
    by c ; 
    updated_e = coalesce(new_e,e); 
    if inb then merged_e = new_e ; 
    else merged_e = e; 
run; 

如果你想合并(所以电子商务在交易中缺失值使得它缺少的结果)的影响,然后用公式:所以,如果你的额外变量命名为Ë那么你可以像这样的代码就像MERGED_E一样。如果您想要更新的效果,请使用UPDATED_E中的公式。如果你有多个额外的变量,那么也要重命名它们并添加额外的赋值语句来处理它们。

+0

伟大的创意答案,我没有想到这个!我只会加BY C D;和IF D;谢谢 – puk789