我有一个奇怪的数据库,如下所示:
Client Order_number Original_number New_number
A 1 . .
. 1 2
B 3 . .
C 4 . .
. 3 5
. 5 6
. 2 8
. 4 9
对于客户A说,他被分配了Order_number
= 1。然后由于某种原因,我们必须更改Order_number
= New_number
= 2
我的目标是为Client
列中的缺失空白填充上面的矩阵,如下所示:
Client Order_number Original_number New_number
A 1 . .
A . 1 2
B 3 . .
C 4 . .
B . 3 5
B . 5 6
A . 2 8
C . 4 9
如果不使用MERGE
,我无法想到一种有效的方法。
答案 0 :(得分:2)
这个程序有效,但是因为我把它扔到一起所以可能会有点重构。它假设整个表格像您的样本一样排序。它使用哈希表,所以如果你正在处理大的东西,这可能会遇到内存限制。
这个想法是在你去的时候建立一些哈希表,这样你就可以得到上面几行中出现的内容。
data want (drop=rc map_:);
if _n_ = 1 then do;
declare hash orig_new();
orig_new.definekey('map_original');
orig_new.definedata('map_new','map_client');
orig_new.definedone();
declare hash new_client();
new_client.definekey('map_new');
new_client.definedata('map_client');
new_client.definedone();
end;
set have;
if order ne . then do;
map_original = order;
map_new = .;
map_client = client;
rc = orig_new.add();
end;
if client = '' then do;
rc = orig_new.find(key:original);
client = map_client;
end;
if new ne . then do;
map_original = original;
map_new = new;
map_client = client;
rc = orig_new.add();
rc = new_client.add();
end;
rc = new_client.find(key:original);
client = map_client;
run;
(我不知道这是否会有所帮助,但至少我很喜欢这个练习。)