2015-08-21 71 views
1

表T1:差異加入

person | visit | code_num1 | code_desc1 
    1  1   100   OTD 
    1  2   101   SED 
    2  3   102   CHM 
    3  4   103   OTD 
    3  4   103   OTD 
    4  5   101   SED 

表T2:

person | visit | code_num2 | code_desc2 
    1  1   104   DME 
    1  6   104   DME 
    3  4   103   OTD 
    3  4   103   OTD 
    3  7   103   OTD 
    4  5   104   DME 

我有合併的人,並參觀了兩個表t1和t2以下SAS代碼:

DATA t3; 
    MERGE t1 t2; 
    BY person visit; 
RUN; 

哪產生以下輸出:

person | visit | code_num1 | code_desc1 |code_num2 | code_desc2 
     1  1   100   OTD  104   DME 
     1  2   101   SED 
     1  6        104   DME   
     2  3   102   CHM 
     3  4   103   OTD  103   OTD 
     3  4   103   OTD  103   OTD 
     3  7        103   OTD 
     4  5   101   SED  104   DME 

我想在一個蜂巢查詢複製本,並使用全外嘗試加入:

​​

其中產量表:

person | visit | code_num1 | code_desc1 |code_num2 | code_desc2 
     1  1   100   OTD  104   DME 
     1  2   101   SED  null  null 
     1  6   null  null  104   DME   
     2  3   102   CHM  null  null 
     3  4   103   OTD  103   OTD 
     3  4   103   OTD  103   OTD 
     3  4   103   OTD  103   OTD 
     3  4   103   OTD  103   OTD 
     3  7   null  null  103   OTD 
     4  5   101   SED  104   DME 

這幾乎是一樣的SAS,但我們有2個額外的行(人= 3,訪問= 4)。我認爲這是因爲配置單元將一個表中的每一行與另一個表中的兩行相匹配,在t3中產生4行,而SAS不會。關於如何讓我的查詢匹配SAS合併輸出的任何建議?

+0

如果有幫助,SAS的做法是,如果將左表和右表限制爲僅共享一個公用鍵值的特定行集(例如,每個表上有兩個3-4行),然後它每次往下走一行 - 所以A.r1 = B.r1和A.r2 = B.r2 - 然後如果一個表用完行,保留最後一行,那麼有效A.r3 = B.r2 A.r4 = B.r2等,如果A有更多的3-4行。 – Joe

+0

另外 - HiveQL沒有Coalesce功能嗎?業務似乎比所有情況都容易。 – Joe

+0

這確實有助於我理解更好的情況。另外,合併的好主意。 @Joe – Danzo

回答

0

如果合併兩個數據集並且它們具有相同名稱的變量(除了變量),那麼來自第二個數據集的變量將overwrite第一個數據集中具有相同名稱的變量。所以你的sas代碼創建一個覆蓋數據集。完整的外連接不會這樣做。

在我看來,如果你先刪除右側表,然後做一個完整的外部聯接,你應該得到蜂巢中的等效表。正如喬指出的那樣,我不認爲需要這種情況。只需加入關鍵值:

create table t3 as 
select coalesce(a.person, b.person) as person 
     , coalesce(a.visit, b.visit) as visit 
     , a.code_num1 
     , a.code_desc1 
     , b.code_num2 
     , b.code_desc2 
    from 
    (select * from t1) a 
    full outer join 
    (select person, visit, code_num2, code_desc2 
     group by person, visit, code_num2, code_desc2 from t2) b 
    on a.person=b.person and a.visit=b.visit 
    ; 

我目前無法測試此代碼,因此請務必對其進行測試。祝你好運。

+0

雖然這確實爲我提供了與SAS表相比的正確表格,但當t2有重複的列不在t1中時,我預見到一個問題。 SAS將把他們全部納入決賽桌,但上面只包括一個,不是嗎? @invoketheshell – Danzo

+0

我同意你上面寫的內容。這是你問的一個很好的問題,所以我提出了這個問題。當我有空時,我會進一步考慮它。 – invoketheshell

+0

謝謝,我仍然在尋找自己的解決方案@invoketheshell – Danzo