2014-09-13 17 views
0

SQL新手 - 我想將事實表crselist加入到crseinfo表中以獲取正確的維度信息。我一直在研究一些相關的子查詢,但沒有給出所需的結果(見下文)。 crseinfo表格指出,從1996年開始,Art 508屬於大學09年,應該稱爲OkArt ..它在2002年和2003年更新.Crselist列出了實際教授的課程。如何將事實表加入SAS(緩存更改日期)

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

你快到了。而不是使用相關子查詢,我認爲這是簡單的做到這一點使用的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; 

這些產生相同的結果,但後者一個更容易被優化成散列連接。

+0

謝謝,這與我一直盯着的相關子查詢完全不同。我仍然相信可以使用更正。子。我會弄清楚這一點,但無論如何這可讀性更強。 – 2014-09-13 21:33:40