我有我試圖通過可變C.以UDPATE在B在A中與記錄記錄的主設備A和事務組B.SAS更新了多個記錄由
DATA TEST;
UPDATE A B;
BY C;
RUN;
的問題是,我在我的主設置中有一些重複的記錄,我仍然想要全部更新它們。但我得到的是一個警告
有指定的按組
而且只有第一個記錄了這些重複的被更新的多個記錄。 有什麼辦法如何告訴SAS來更新所有的人? 還是有其他的,完全不同的方式?
任何幫助表示讚賞。
我有我試圖通過可變C.以UDPATE在B在A中與記錄記錄的主設備A和事務組B.SAS更新了多個記錄由
DATA TEST;
UPDATE A B;
BY C;
RUN;
的問題是,我在我的主設置中有一些重複的記錄,我仍然想要全部更新它們。但我得到的是一個警告
有指定的按組
而且只有第一個記錄了這些重複的被更新的多個記錄。 有什麼辦法如何告訴SAS來更新所有的人? 還是有其他的,完全不同的方式?
任何幫助表示讚賞。
如果您創建用於您更新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;
如果你真的想申請交易然後展開您的交易文件,以具有關鍵變量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中的公式。如果你有多個額外的變量,那麼也要重命名它們並添加額外的賦值語句來處理它們。
偉大的創意答案,我沒有想到這個!我只會加BY C D;和IF D;謝謝 – puk789
張貼一些樣本數據。如果表A不是變量C,那麼表A的唯一標識符是什麼?你想替換C中的變量的值嗎?或者當B的變量缺少值時,是否希望保留來自A的原始值而不是將該值設置爲缺失。 – Tom
問題是我在表中的唯一密鑰基於變量C和D.但是我只有在我的transactioni表變量C。這就是爲什麼我只用C來更新它。 – puk789
正如SAS文檔所述:如果主數據集中存在重複項,則只會更新第一個匹配項,因爲生成的WHERE語句始終會在主數據庫中查找第一個匹配項。但我真的希望有另一種方式。 – puk789