如何将事实表加入(Kimball类型2?)在SAS中慢慢改变日期

时间:2014-09-13 18:51:09

标签: sql sas scd

SQL新手 - 我想将事实表crselist加入crseinfo表以获取正确的维度信息。我一直在研究一些相关的子查询,但没有给出所需的结果(如下)。 crseinfo表说,从1996年开始,艺术508属于09大学,应该被称为OkArt ..在2002年和2003年更新.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帮助页面(http://web.utk.edu/sas/OnlineTutor/1.2/en/60477/m70/m70_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的解决方案感兴趣 - 谢谢您的时间。

1 个答案:

答案 0 :(得分:1)

你快到了。我认为使用havinggroup 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;

这些产生相同的结果,但后者更容易优化为散列连接。