2017-03-16 75 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