SAS中文论坛

标题: 找最高级 [打印本页]

作者: Lctrapani    时间: 2014-6-19 12:27
标题: 找最高级
本帖最后由 Lctrapani 于 2014-6-19 12:27 编辑

数据约40.000条,如下:Data Konzern;
Input ID konzernID;
cards;

1 18
2  5
3 18
4 24
5 9
6 9
7 15
8 12
9 102
....

run;

问题:如何将每个ID所对应的最高级konzernID找到?
上面例子找到最高级后:                                 
1 18 18
2 5 1023 18 18
4 24 24
5 9 102
6 9 102
......
有的ID的下一级就是最高级了,有的要经过几级才达到最高级。有什么简单的好办法吗?



作者: mono    时间: 2014-6-19 14:09
数据到底是是什么样的?没搞明白
1 18
2 5
2 1023
2 18
2 18


作者: Lctrapani    时间: 2014-6-20 01:48
Sorry! 应该是:

找到最高级后:
ID    konzernID    highestID
1      18                 18
2       5                  102 *这里的102 是这样找到的:2的下一级是5,5的下一级是9,9的下一级是102,102没有下一级了,那么102 就是2的最高级了。真实数据是:ID是一家子公司的编号,这里是2,它的母公司是5,5又是编号为9的公司的子公司,如果在这四万条的数据中没有编号为ID=9的子公司,那么9就是最高级的Konzern(康采恩,母公司)了。如果有,那么看它的下一级102是否是某家公司的子公司,也就是能否在数据中找到ID=102,找不到,102就是要找的最高级。;
3       18                  18
4       24                   24
5        9                   102
6        9                   102
7        15                  15     *再说明一下,15在这个例子中既是7的直接母公司,也是7的最高级母公司。
.......

我虽然解决了问题,但是用了20多步的DATA和SQL。应该有更简洁漂亮的解决方法。
谢谢关注!请继续关注。
作者: 愤怒的老鸟    时间: 2014-6-24 17:49
用IML。。。。。。
作者: Lctrapani    时间: 2014-6-25 05:13
Really? 等出差回来一定试一试。

先谢谢了。
作者: 6皮皮9    时间: 2014-7-1 18:55
我刚写了这个,还可以用,对于小数据集。数据集Result就是你要的结果了
可能还需要调试
data konzern;
Input ID konzernID;
cards;
1 18
2  5
3 18
4 24
5 9
6 9
7 15
8 12
9 102
;
run;
proc iml;
use konzern;
read all var _num_  into m;
close konzern;
a=m[,1];
b=m[,2];
create max var {max_number};
do i=1 to nrow(m);
        if  ncol(loc(a=b[i,]))>0 then do;
                c=loc(a=b[i,]);
                max_num=b[c,];
        do while(ncol(loc(a=max_num))>0);
                d=loc(a=max_num);
                max_num=b[d,];
                end;
        end;
        else do;
                max_num=b[i,];
        end;
edit max;
append from max_num;
end;
quit;
data result;
merge konzern max;
run;
作者: 6皮皮9    时间: 2014-7-1 19:16
如果出现这样的情况,ID数大于KONZERNID的话,这个程序就会进入到死循环了。比如这里我修改数据 ID 5对应的数据是2,那么他就返回查到ID 2的数值是5,这样就循环死了。这样的话,你自己要添加一个判定条件哦。
data konzern2;
Input ID konzernID;
cards;
1 18
2  5
3 18
4 24
5 2
6 9
7 15
8 12
9 102
;
run;




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2