我想将事实表crselist加入到crseinfo表中,以获得正确的维度信息。我一直在处理一些相关的子查询,但是没有一个给出期望的结果(如下所示)。crseinfo表显示,从199610开始,Art508属于09年大学,在200220和200300应该被称为OkArt..which更新。Crselist列出了实际教授的课程。
data crseinfo ;
input crsenme $ crsenum crsefx crsecollege $ crsedesc $9.;
cards;
ART 508 199610 09 OkArt
ART 508 200220 18 WowItsArt
ART 508 200300 18 SuperArt
;
run;
data crselist;
input crsenme $ crsenum term section $;
cards;
ART 508 199610 01
ART 508 199610 02
ART 508 199610 03
ART 508 199710 01
ART 508 200220 01
ART 508 200220 02
ART 508 201020 01
ART 508 201120 01
;
run;所期望的结果是:
data desired ;
input crsenme $ crsenum term section $ crsecollege $ crsedesc $9.;
cards;
ART 508 199610 01 09 OkArt
ART 508 199610 02 09 OkArt
ART 508 199610 03 09 OkArt
ART 508 199710 01 09 OkArt
ART 508 200220 01 18 WowItsArt
ART 508 200220 02 18 WowItsArt
ART 508 201020 01 18 SuperArt
ART 508 201120 01 18 SuperArt
;参考SAS帮助页面(52.htm),我似乎可以这样做:
proc sql ;
select *
from crseinfo a, crselist b
where a.crsenme eq b.crsenme and
a.crsenum eq b.crsenum and
b.term eq (select min(c.term)
from crselist c
where c.term ge a.crsefx )
;
quit;但这行不通。我对基于SQL的解决方案感兴趣--谢谢您的时间。
发布于 2014-09-13 20:10:38
你就快到了。与其使用关联子查询,我认为使用having和group by子句组合来实现这一操作更简单:
proc sql noprint _method;
create table desired2 as
select a.*, b.crsecollege, b.crsedesc
from crselist a left join crseinfo b
on a.crsenme = b.crsenme and a.crsenum = b.crsenum
where a.term ge b.crsefx
group by a.crsenme, a.crsenum, a.term
having b.crsefx = max(b.crsefx)
;
quit;稍微简单一点的版本:
proc sql noprint _method;
create table desired3 as
select a.*, b.crsecollege, b.crsedesc
from crselist a, crseinfo b
where a.crsenme = b.crsenme
and a.crsenum = b.crsenum
and a.term ge b.crsefx
group by a.crsenme, a.crsenum, a.term, a.section
having b.crsefx = max(b.crsefx)
;
quit;它们产生相同的结果,但后者更容易优化为散列连接。
https://stackoverflow.com/questions/25826524
复制相似问题