2014-09-13 3 views
0

새로운 기능 SQL - 올바른 차원 정보를 얻기 위해 crseinfo 테이블에 사실 테이블 crselist를 가입시키고 싶습니다. 상관 관계가있는 하위 쿼리를 작업했지만 아무도 원하는 결과를 얻지 못했습니다 (아래). crseinfo 테이블은 199610 년 초에 아트 508이 대학 09에 속하며 OkArt라고해야한다고 말합니다. 2002 년과 2003 년에 업데이트됩니다. Crselist는 실제로 가르친 과목을 나열합니다. 내가 좋아하는 뭔가를 할 수있는 것처럼 보일 것입니다사실 테이블을 (Kimball type 2?) SAS에 천천히 변화하는 날짜에 가입시키는 방법

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) 참조 :

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; 

원하는 결과는 것

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

거의 다 왔어. 이들은 동일한 결과를

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; 

하지만, 후자 :

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; 

약간 간단 버전 : 오히려 상관 하위 쿼리를 사용하는 것보다, 나는 그것이 havinggroup by 조항의 조합을 사용하여이 작업을 수행하는 것이 더 간단 생각 하나는 해시 조인에보다 쉽게 ​​최적화됩니다.

+0

감사합니다. 그것은 내가 꼼짝 않고 바라본 상관 관계가있는 하위 쿼리와 완전히 다릅니다. 나는 아직도 그것이 코르를 사용할 수 있다고 믿습니다. 보결. 나는 이것을 알아낼 것입니다, 그러나 이것은 어쨌든 훨씬 더 읽기 쉽습니다. –