簡體   English   中英

如何在SAS中將事實表聯接到(Kimball類型2?)緩慢更改的日期

[英]How to join a fact table to a (Kimball type 2?) slowly changing date in SAS

SQL的新功能-我想將事實表crselist加入crseinfo表中以獲得正確的維度信息。 我一直在研究一些相關的子查詢,但沒有一個能提供理想的結果(如下)。 crseinfo表顯示,從199610年開始,Art 508屬於大學09,應該稱為OkArt ..,該名稱在200220年和200300年進行了更新。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的解決方案感興趣-謝謝您的時間。

你快到了 我認為與其使用關聯的子查詢,不如使用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;

這些產生相同的結果,但后者更容易優化為哈希聯接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM