0

我有一个看起来像这样的奇怪数据库:

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为 a 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.

4

1 回答 1

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;

(我不知道这是否会有所帮助,但至少我喜欢这个练习。)

于 2013-10-02T20:27:05.307 回答