2016-11-15 103 views
0

我想要做的是找到下面的代碼替代:SAS PROC SQL和內連接 - 什麼是替代方法

PROC SQL; 
    CREATE TABLE XXXX AS 
    SELECT DISTINCT t2.WC, t2.CWC 
     FROM YYYY t1 
      INNER JOIN ZZZZ t2 ON (t1.MC = t2.WC) 
; 
QUIT; 

可能有人請使用哈希或任何其他做同樣的事情幫助方法?

我有以下表格:

data have01; 
infile cards truncover expandtabs; 
input MC $ LC $ MCC $ MCN $ TLC $ DD $ ODS_TimeStamp ODS_LUpd zTPl $ PuD $; 
cards; 
1853 DR14 1 Vetu SM3 . 24SEP2013:10:06:53.580 20JUL2016:12:55:39.240 0 . 
1856 DR14 1 Vetu SM3 . 24SEP2013:10:06:53.580 20JUL2016:12:55:39.240 0 . 
1869 DR14 1 Vetu SM3 . 24SEP2013:10:06:53.580 20JUL2016:12:55:39.240 0 . 
2024 DV16 1 Vetu SM3 2008-01-31 24SEP2013:10:06:53.580 20JUL2016:12:55:39.240 47 . 
2025 DV16 1 Vetu SM3 2008-01-31 24SEP2013:10:06:53.580 20JUL2016:12:55:39.240 47 . 
run; 

您可能必須在上表中格式化日期列。

data have02; 
infile cards truncover expandtabs; 
input WPMVId ToSTimeStamp TId ASN WC $ CWC $ TSide $ MNo Y X; 
cards; 
1 21AUG2012:17:57:39.000 20949 1 7604 HPUS230 R 1 -82140 2468 
2 21AUG2012:17:57:39.000 20949 1 7604 HPUS230 R 2 -81940 2466 
3 21AUG2012:17:57:39.000 20949 1 7604 HPUS230 R 3 -81739 2463 
4 21AUG2012:17:57:39.000 20949 1 7604 HPUS230 R 4 -81539 2459 
5 21AUG2012:17:57:39.000 20949 1 7604 HPUS230 R 5 -81339 2456 
6 21AUG2012:17:57:39.000 20949 1 7604 HPUS230 R 6 -81139 2453 
run; 

您可能必須格式化上表中的日期列。

使用一些替代上面的SQL代碼,請幫助我,特別是當我有問題,上面我的表2是幾乎0.8十億行的數據,它需要地獄了大量的時間來運行如上SQL查詢。

回答

2

您可以使用哈希對象。如果你有一個大的數據集並且你不想在合併之前對它進行排序,這是非常好的。

假設您必須在工作庫中設置數據集Aset和Bset,並且要將它們合併到ID變量IDVar1和IDVar2(它們唯一標識兩個數據集中的每個條目並且都爲這兩個數據集定義)。兩個數據集中的所有其他變量名稱不同。結果數據集將被稱爲「合併」。這裏是一個小例子:

data Aset; 
input idvar1 idvar2 var1inA var2inA; 
datalines; 
1 48 5 100 
1 8 6 165 
2 5 7 102 
2 965 8 136 
3 105 9 145 
4 105 10 456 
3 85 12 454 
; 
run; 

data Bset; 
input idvar1 idvar2 var1inB var2inB; 
datalines; 
2 48 5 100 
2 965 6 165 
2 5 7 102 
1 965 8 136 
5 105 9 145 
3 105 10 456 
3 85 12 454 
; 
run; 

data merged (drop=retval); 
    if 0 then set Aset; 
    if _N_=1 then do; 
    declare hash hh(dataset:'Aset',ordered:'A'); 
    hh.definekey('IDVar1','IDVar2'); 
    hh.definedata(all:'Y'); 
    hh.definedone(); 
    end; 

    do while (not done); 
     set Bset end=done; 
     retval = hh.find(); 
     if (retval=0) then output; 
    end; 
    stop; 
    run; 

ODS LISTING:

Obs. idvar1 idvar2 var1inA var2inA var1inB var2inB 
1   2  965  8  136  6  165 
2   2   5  7  102  7  102 
3   3  105  9  145  10  456 
4   3   85  12  454  12  454 

UPDATE:

下面的代碼適用於提供的數據的例子。我改變了一些格式來適應值,並添加了一些長度語句。

data have01; 
infile cards truncover expandtabs; 
length ODS_TimeStamp $23. ODS_LUpd $23. DD $10.; 
input MC LC $ MCC MCN $ TLC $ DD $ ODS_TimeStamp $ ODS_LUpd $ zTPl PuD $; 
cards; 
1853 DR14 1 Vetu SM3 . 24SEP2013:10:06:53.580 20JUL2016:12:55:39.240 0 . 
1856 DR14 1 Vetu SM3 . 24SEP2013:10:06:53.580 20JUL2016:12:55:39.240 0 . 
1869 DR14 1 Vetu SM3 . 24SEP2013:10:06:53.580 20JUL2016:12:55:39.240 0 . 
2024 DV16 1 Vetu SM3 2008-01-31 24SEP2013:10:06:53.580 20JUL2016:12:55:39.240 47 . 
2025 DV16 1 Vetu SM3 2008-01-31 24SEP2013:10:06:53.580 20JUL2016:12:55:39.240 47 . 
run; 

data have02; 
infile cards truncover expandtabs; 
length ToSTimeStamp $23.; 
input WPMVId ToSTimeStamp $ TId ASN WC CWC $ TSide $ MNo Y X; 
cards; 
1 21AUG2012:17:57:39.000 20949 1 2024 HPUS230 R 1 -82140 2468 
2 21AUG2012:17:57:39.000 20949 1 7604 HPUS230 R 2 -81940 2466 
3 21AUG2012:17:57:39.000 20949 1 7604 HPUS230 R 3 -81739 2463 
4 21AUG2012:17:57:39.000 20949 1 2024 HPUS230 R 4 -81539 2459 
5 21AUG2012:17:57:39.000 20949 1 7604 HPUS230 R 5 -81339 2456 
6 21AUG2012:17:57:39.000 20949 1 7604 HPUS230 R 6 -81139 2453 
run; 


data merged (drop=retval); 
    if 0 then set have01; 
    if _N_=1 then do; 
    declare hash hh(dataset:'have01',ordered:'A'); 
    hh.definekey('MC'); 
    hh.definedata(all:'Y'); 
    hh.definedone(); 
    end; 

    do while (not done); 
     set have02 (rename=(WC=MC)) end=done; 
     retval = hh.find(); 
     if (retval=0) then output; 
    end; 
    stop; 
    run; 
+0

我知道你的ID變量是WC和MC。他們沒有匹配的值。聯合集將是空的。 –

+0

不,不,沒有數十億行數據。相信我,這只是樣本。 WC和MC在數據源中有共同的價值:) – ZeekDSA

+1

800 Mio.的條目你肯定會遇到內存大小問題,因爲你的散列對象會變得非常大。這是新的信息。我將需要更新我的帖子。我會做,當我得到它:d –

0

任何比下面這個答案比較好...

data work.xx; 
merge 
    work.yy (in=a keep=mc rename=(mc=wc)) 
    work.zz (in=b keep=wc cwc) 
; 
by wc; 
if a and b; 
run; 

proc sort data=work.xx nodupkey; 
by wc cwc; 
run; 
+0

在什麼意義上定義'更好'?易於維護?可移植性?系統資源使用? – user667489

+0

返回結果並節省內存的速度。 – ZeekDSA