首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将事实表连接到一个(Kimball类型2?)SAS中缓慢变化的日期

如何将事实表连接到一个(Kimball类型2?)SAS中缓慢变化的日期
EN

Stack Overflow用户
提问于 2014-09-13 18:51:08
回答 1查看 562关注 0票数 0

我想将事实表crselist加入到crseinfo表中,以获得正确的维度信息。我一直在处理一些相关的子查询,但是没有一个给出期望的结果(如下所示)。crseinfo表显示,从199610开始,Art508属于09年大学,在200220和200300应该被称为OkArt..which更新。Crselist列出了实际教授的课程。

代码语言:javascript
运行
复制
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;

所期望的结果是:

代码语言:javascript
运行
复制
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),我似乎可以这样做:

代码语言:javascript
运行
复制
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的解决方案感兴趣--谢谢您的时间。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-13 20:10:38

你就快到了。与其使用关联子查询,我认为使用havinggroup by子句组合来实现这一操作更简单:

代码语言:javascript
运行
复制
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;

稍微简单一点的版本:

代码语言:javascript
运行
复制
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;

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25826524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档