SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 821|回复: 9
打印 上一主题 下一主题

难题求解

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2011-1-23 10:14:45 | 只看该作者

难题求解

数据如下(多个ID, 这里仅显示一个ID作为例子)
记录号  ID   Time
1            1     11
2            1     10
3            1     21
4            1     20
5            1     30
6            1     30
找出一个或所有记录对满足他们的时间差为10.
例如记录2和记录4, 记录4和记录5, 记录4和记录6.
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2011-1-23 11:18:26 | 只看该作者

Re: 难题求解

暂时三种方法:

1,transpose,然后数组和循环
2,double set
3,hash 的iterator
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2011-1-26 18:51:04 | 只看该作者

Re: 难题求解

[code:12gp2v55]data test;
input id n1 n2;
cards;
1 1 11
2 1 10
3 1 21
4 1 20
5 1 30
6 1 30
;
run;

proc sql;
        select a.id as var1, b.id as var2
        from test as a, test as b
        where a.n2-b.n2=10
;quit;[/code:12gp2v55]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2011-1-27 12:53:02 | 只看该作者

Re: 难题求解

不考虑ID了?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2011-1-28 05:10:59 | 只看该作者

Re: 难题求解

to sxlion
All three methods above can be used to sovle this problem. However,
the first and third one are not good for the large data set because of
the limitation of computer memory. So the second one is the best - using
POINT option for direct access.

Unlike any other databases, the record pointer (not exist but you can
imagine) in SAS can not move forward or backward freely with your
control. I am still struggling on this problem. Once I have the solution,
I will share it with you guys for sure. We might consider the following
piece of sas code:

data test_1;
set test;
by ID;
retain pointer .;
if first.id=1 then pointer=_N_;  
if not last.id then do;
   pointer=pointer+1;
.
.
.
.
   do j=pointer to last_positon_within_ID;
       set test(rename=(time=time_1) keep=time) POINT=j;
       if time_1-time=10 then do something;
   end;
.
.
.
run;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2011-1-28 09:26:19 | 只看该作者

Re: 难题求解

楼主做pharm或者health care的吧?数据有多大,SQL的 Cartesian product做不了?一定要用data step实现?Just curious.
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2011-1-28 14:24:25 | 只看该作者

Re: 难题求解

to 楼主, 你的那个solution不是正中data步的缺点吗?

pangmao的sql方法挺好的啊,其实楼主的问题不完整,就是找出来后,你需要以怎样的一种方式标示他们。

另外hash比你想象的可能要快100倍以上。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2011-1-31 22:50:27 | 只看该作者

Re: 难题求解

抱歉,跟sas-l的一些大老讨论了。我的SQL self-join的算法在50,000observation以上会memory overflow. Arthur Tabachneck 给了一个替代方案,我再研究一下,有结果贴上来.
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2011-2-1 11:59:40 | 只看该作者

Re: 难题求解

数据量多的话,什么都会慢的。

proc什么的,数据量大了,直接忽略。
sql的内积费cpu的,
双data步应该表现不俗,
100万左右,hash速度很快,远超过双data步,再多的话,内存吃紧。

pangmao,对于这种数据内部比较的问题,还有更好的方法么 ?

ps:我也去看看SAS_L
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2011-2-1 12:43:01 | 只看该作者

Re: 难题求解

pangmao,给个地址,找半天没找到,是在L上,还是在community论坛上 ?
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-13 08:56 , Processed in 0.069675 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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