0

SQL の初心者 - ファクト テーブル crselist を crseinfo テーブルに結合して、正しいディメンション情報を取得したいと考えています。私はいくつかの相関サブクエリに取り組んできましたが、望ましい結果が得られるものはありません(以下)。crseinfo テーブルによると、199610 年からアート 508 はカレッジ 09 に属し、200220 および 200300 で更新される OkArt と呼ばれる必要があります。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 ベースのソリューションに興味があります。お時間をいただきありがとうございます。

4

1 に答える 1

1

もうすぐそこです。having相関サブクエリを使用するよりも、節とgroup 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;

これらは同じ結果を生成しますが、後者の方がより容易にハッシュ結合に最適化されます。

于 2014-09-13T20:10:38.860 に答える