SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 3271|回复: 6
打印 上一主题 下一主题

找最高级

[复制链接]

1

主题

4

帖子

27

积分

新手上路

Rank: 1

积分
27
跳转到指定楼层
楼主
发表于 2014-6-19 12:27:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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的下一级就是最高级了,有的要经过几级才达到最高级。有什么简单的好办法吗?


分享到:  微信微信
收藏收藏
回复

使用道具 举报

2

主题

41

帖子

318

积分

中级会员

Rank: 3Rank: 3

积分
318
沙发
发表于 2014-6-19 14:09:24 | 只看该作者
数据到底是是什么样的?没搞明白
1 18
2 5
2 1023
2 18
2 18

回复 支持 反对

使用道具 举报

1

主题

4

帖子

27

积分

新手上路

Rank: 1

积分
27
板凳
 楼主| 发表于 2014-6-20 01:48:46 | 只看该作者
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。应该有更简洁漂亮的解决方法。
谢谢关注!请继续关注。
回复 支持 反对

使用道具 举报

0

主题

7

帖子

131

积分

注册会员

Rank: 2

积分
131
地板
发表于 2014-6-24 17:49:25 | 只看该作者
用IML。。。。。。
回复

使用道具 举报

1

主题

4

帖子

27

积分

新手上路

Rank: 1

积分
27
5#
 楼主| 发表于 2014-6-25 05:13:07 | 只看该作者
Really? 等出差回来一定试一试。

先谢谢了。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

22

积分

新手上路

Rank: 1

积分
22
6#
发表于 2014-7-1 18:55:46 | 只看该作者
我刚写了这个,还可以用,对于小数据集。数据集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;
回复 支持 反对

使用道具 举报

0

主题

2

帖子

22

积分

新手上路

Rank: 1

积分
22
7#
发表于 2014-7-1 19:16:46 | 只看该作者
如果出现这样的情况,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;
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2024-12-22 14:10 , Processed in 1.731219 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表