SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 596|回复: 5
打印 上一主题 下一主题

再次请教从两个表提取数据的问题

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2011-6-20 09:28:07 | 只看该作者

再次请教从两个表提取数据的问题

上次vicky1020 已经给出了一种解决方案,但是运行起来比较慢,我的新数据跑了15个小时,才完成十分之一 <!-- s:o --><img src="{SMILIES_PATH}/icon_surprised.gif" alt=":o" title="Surprised" /><!-- s:o -->

问题如下:有两个数据表a、b,现在要根据表b的记录,从表a中提取数据,要求根据表b的每一条记录取出变量date当天以及前后三天的数据(要求code相同),需要注意的是表a中date是不连续的。

data a;
input ID$ Date yymmdd8. Num;
format Date yymmdd10.;
cards;
001 08-06-30 100
001 08-07-02 200
001 08-07-03 100
001 08-07-04 900
001 08-07-05 100
001 08-07-08 800
001 08-07-09 100
001 08-07-10 200
001 08-07-11 100
001 08-07-12 100
001 08-07-13 500
001 08-07-14 100
002 08-06-29 100
002 08-07-02 200
002 08-07-03 100
002 08-07-04 900
002 08-07-05 100
002 08-07-06 800
002 08-07-07 100
002 08-07-08 200
002 08-07-12 100
002 08-07-13 100
002 08-07-14 500
002 08-07-15 100
;


data b;
input ID$ Date yymmdd8. company;
format Date yymmdd10.;
cards;
001 08-07-05 1
001 08-07-08 2
002 08-07-04 2
002 08-07-06 3
001 08-07-09 2
;

我需要的结果如下:
ID Date Num company
001 08-07-02 200 1
001 08-07-03 100 1
001 08-07-04 900 1
001 08-07-05 100 1
001 08-07-08 800 1
001 08-07-09 100 1
001 08-07-10 200 1
001 08-07-03 900 2
001 08-07-04 100 2
001 08-07-05 800 2
001 08-07-08 100 2
001 08-07-09 200 2
001 08-07-10 100 2
001 08-07-11 100 2
002 08-06-29 100 2
002 08-07-02 200 2
002 08-07-03 100 2
002 08-07-04 900 2
002 08-07-05 100 2
002 08-07-06 800 2
002 08-07-07 100 2
002 08-07-03 100 3
002 08-07-04 900 3
002 08-07-05 100 3
002 08-07-06 800 3
002 08-07-07 100 3
002 08-07-08 200 3
002 08-07-12 100 3
002 08-07-04 800 2
002 08-07-05 100 2
002 08-07-08 200 2
002 08-07-09 100 2
002 08-07-10 100 2
002 08-07-11 500 2
002 08-07-12 100 2

上述数据只是一个简单的例子,实际数据a大概有近200万条数据,表b有近20000条记录,根据不同情况,可能需要取date前后150天的数据。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2011-6-20 16:50:04 | 只看该作者

Re: 再次请教从两个表提取数据的问题

感觉你的结果有点不对啊,以b中第一条为例,08-07-05,他的最大日期也就是8号,你怎么得到了10号的数据呢?
我的想法是补全b的数据,根据你的日期差,如果是150天的话,那前后就是301条,如果b表有2万条,则有600万左右。
然后a表是200万,两边数据量差不多,merge起来也不会很慢。你可以试试咯。
%let dur=3;
data b1;
set b(rename=(date=date1));
do i=-&amp;dur  to &amp;dur;
date=intnx('day',date1,i);
output;
end;
format date yymmdd10.;
*drop i date1 ;
run;
proc sort data=b1;
by id date;
run;
data c;
merge a(in=in1) b1(in=in2);
by id date;
if in1 and in2 then output;
run;
proc sort data=c;
by id company date;
run;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2011-6-21 16:42:41 | 只看该作者

Re: 再次请教从两个表提取数据的问题

没完全明白你的意思, 你的company怎么取值的?

[code:2ip4ia1f]

proc sql;
   create table c as
   select distinct a&#46;*,b&#46;company
   from a , b
   where ( b&#46;Date -3 le a&#46;Date le b&#46;Date+3)
         and a&#46;id=b&#46;id
   order by id, company,Date
;
quit;




[/code:2ip4ia1f]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2011-6-22 14:32:00 | 只看该作者

Re: 再次请教从两个表提取数据的问题

这主要是表a中的日期不是连续的,表a中ID=001的日期5号过了就直接是8号,我的要求是取出08-07-05这一条记录的前后3条,而不是08-07-05这一天前后三天。

如果日期是连续的,这个问题也就比较容易解决了。

[quote=&quot;jimmy782&quot;]感觉你的结果有点不对啊,以b中第一条为例,08-07-05,他的最大日期也就是8号,你怎么得到了10号的数据呢?
我的想法是补全b的数据,根据你的日期差,如果是150天的话,那前后就是301条,如果b表有2万条,则有600万左右。
然后a表是200万,两边数据量差不多,merge起来也不会很慢。你可以试试咯。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2011-6-22 14:35:02 | 只看该作者

Re: 再次请教从两个表提取数据的问题

可以这么理解:表a是材料的价格序列,表b是不同company采购材料的日期和数量。


[quote=&quot;灵犀一指&quot;:13kv51hh]没完全明白你的意思, 你的company怎么取值的?

[code:13kv51hh]

proc sql;
create table c as
select distinct a&#46;*,b&#46;company
from a , b
where ( b&#46;Date -3 le a&#46;Date le b&#46;Date+3)
and a&#46;id=b&#46;id
order by id, company,Date
;
quit;




[/code:13kv51hh][/quote:13kv51hh]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2011-6-23 13:59:15 | 只看该作者

Re: 再次请教从两个表提取数据的问题

麻烦点的方法,顺序排列,对每一条取lag1 lag2 lag3,然后倒序,取lag1 lag2 lag3,这就是前后3条啦,最后再merge。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-10 05:26 , Processed in 0.070773 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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