SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1577|回复: 16
打印 上一主题 下一主题

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

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2011-4-1 12:45:17 | 只看该作者

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

有两个数据表a、b,现在要根据表b的记录,从表a中提取数据,要求根据表b的每一条记录取出变量date当天以及前后三天的数据(code相同)。

data a;
input ID$ Date yymmdd8. Num;
format Date yymmdd10.;
cards;
001 08-07-01 100
001 08-07-02 200
001 08-07-03 100
001 08-07-04 900
001 08-07-05 100
001 08-07-06 800
001 08-07-07 100
001 08-07-08 200
001 08-07-09 100
001 08-07-10 100
001 08-07-11 500
001 08-07-12 100
002 08-07-01 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-09 100
002 08-07-10 100
002 08-07-11 500
002 08-07-12 100
;


data b;
input ID$ Date yymmdd8. company;
format Date yymmdd10.;
cards;
001 08-07-05 1
001 08-07-07 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-06 800 1
001 08-07-07 100 1
001 08-07-08 200 1
001 08-07-04 900 2
001 08-07-05 100 2
001 08-07-06 800 2
001 08-07-07 100 2
001 08-07-08 200 2
001 08-07-09 100 2
001 08-07-10 100 2
002 08-07-01 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-09 100 3
002 08-07-06 800 2
002 08-07-07 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

不知道说清楚了没有,谢谢 <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->
回复 支持 反对

使用道具 举报

0

主题

0

帖子

2

积分

新手上路

Rank: 1

积分
2
沙发
发表于 2011-4-1 13:37:45 | 只看该作者

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

[code:cact5um8]
proc sql;
create table v as select a&#46;*,b&#46;company
from b as b
left join a  as a
on a&#46;ID=b&#46;id  and b&#46;date+3&gt;=a&#46;date&gt;=b&#46;date-3
order by id, company,date;
quit;[/code:cact5um8]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2011-4-1 22:59:39 | 只看该作者

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

[quote=&quot;vicky1020&quot;:62d7hcyf][code:62d7hcyf]
proc sql;
create table v as select a&#46;*,b&#46;company
from b as b
left join a as a
on a&#46;ID=b&#46;id and b&#46;date+3&gt;=a&#46;date&gt;=b&#46;date-3
order by id, company,date;
quit;[/code:62d7hcyf][/quote:62d7hcyf]

谢谢,不过有点小问题,日期可能不是连续的,比如周日刚好没有记录。
回复 支持 反对

使用道具 举报

0

主题

0

帖子

2

积分

新手上路

Rank: 1

积分
2
地板
发表于 2011-4-2 09:40:21 | 只看该作者

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

没明白,为什么要连续?
是周日算休息,然后取前后3个工作日的record?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2011-4-2 10:26:21 | 只看该作者

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

[quote=&quot;vicky1020&quot;:346h1kuq]没明白,为什么要连续?
是周日算休息,然后取前后3个工作日的record?[/quote:346h1kuq]


b.date+3&gt;=a.date&gt;=b.date-3要日期是连续的能保证表B的没条记录可以表A中取出7条来。

比如,如果A表的日期是(08-07-08没有数据 ):
001 08-07-01 100
001 08-07-02 200
001 08-07-03 100
001 08-07-04 900
001 08-07-05 100
001 08-07-06 800
001 08-07-07 100
001 08-07-09 200
001 08-07-10 100
001 08-07-11 100
001 08-07-12 500
B表的数据时
001 08-07-05 1
取出来的数据应该是
001 08-07-02 200
001 08-07-03 100
001 08-07-04 900
001 08-07-05 100
001 08-07-06 800
001 08-07-07 100
001 08-07-09 200
(08-07-08没有,再下一天就是08-07-09了  )
回复 支持 反对

使用道具 举报

0

主题

0

帖子

2

积分

新手上路

Rank: 1

积分
2
6#
发表于 2011-4-2 13:57:18 | 只看该作者

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

那你应该给一个不全的data呀~~
如果每周固定某天没有数据,比如周日没有~~~
proc sql;
create table v as select a.*,b.company,b.date as date_mid
from b as b
left join a as a
on a.ID=b.id and b.date+3+(5&lt;=weekday(b.date)&lt;=7)&gt;=a.date&gt;=b.date-3-(2&lt;=weekday(b.date)&lt;=4)
order by id,date_mid, company,date;
quit;

btw, 08-07-08是周二
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2011-4-2 15:14:39 | 只看该作者

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

恩,谢谢,我开始没把问题描述清楚!
现在关键是空缺的日期不是很有规律,节假日什么的都是空的。
回复 支持 反对

使用道具 举报

0

主题

0

帖子

2

积分

新手上路

Rank: 1

积分
2
8#
发表于 2011-4-2 15:24:42 | 只看该作者

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

土人土法

proc sql;
create table vtemp  as select a.*,b.company,b.date as date_mid
from b as b
left join a as a
on a.ID=b.id ;
quit;

%macro a(yymmdd,id,lag=3);

%let con= %str(id=&quot;&amp;id&quot; and date_mid=&amp;yymmdd.);

proc sql;
create table v1 as select *
from vtemp  where date&lt; &amp;yymmdd. and &amp;con.
order by date descending;
create table v2 as select *
from vtemp  where date&gt; &amp;yymmdd. and &amp;con.
order by date ascending ;
create table v3 as select *
from vtemp  where date= &amp;yymmdd. and &amp;con.;
quit;

data vv_final ;
set vv_final v1(obs=&amp;lag.) v3(obs=1) v2 (obs=&amp;lag.) ;
run;

%mend a;

data vv_final;
set vtemp(obs=0);
data _null_;
set b ;
call execute('%a('||date||','||id||');');
call execute('run;');
run;  

应该有更fancy的方法
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2011-4-2 15:59:18 | 只看该作者

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

多谢,程序虽然复杂一点,但是管用,问题是第一个left join会导致数据量奇大无比 <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->  <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2011-4-2 16:54:11 | 只看该作者

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

[quote=&quot;vicky1020&quot;:pdhu8iho]土人土法[/quote:pdhu8iho]
vicky姐自谦啊,俺菜拿data步捣鼓了半天没搞出来捏...
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-3 07:31 , Processed in 0.069776 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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