2017-03-11 56 views
0

我正在使用完全連接查看來自兩個不同選擇語句的用戶id的重疊和非重疊(唯一值)。主要區別在於一個表的deal_id = 0,另一個表的deal_id大於或等於1。 我正在加入exchange_id,pub_id和user_id上的select語句,但不在deal_id上。 這裏是我的查詢:爲什麼只有一個字段上的全部聯接會在該字段上返回空值?

SET 
hive.auto.convert.join = TRUE 
; 

SELECT 
    First.deal_id 
    ,COALESCE(First.exchange_id, Second.exchange_id) as exchange_id 
    ,COALESCE(First.pub_id, Second.pub_id) as pub_id 
    ,COUNT (DISTINCT(case when Second.user_id is null then First.user_id else null END)) AS Incremental 
    ,SUM (First.imps) AS First_imps 
    ,SUM (Second.imps) AS Second_imps 
    FROM 
     (
      SELECT 
       a.deal_id 
       ,a.exchange_id 
       ,a.pub_id 
       ,a.user_id 
       ,1 AS imps 
      FROM 
       logs a 
      WHERE 
       a.deal_id >= 1 
      AND a.event_type = 'TRUE' 
     ) First 
     FULL JOIN (
      SELECT 
       a.exchange_id 
       ,a.pub_id 
       ,a.user_id 
       ,1 AS imps 
      FROM 
       logs a 
      WHERE 
      a.deal_id = 0 
      AND a.event_type = 'TRUE' 
     ) Second 
     ON (
      First.exchange_id = Second.exchange_id 
      AND First.pub_id = Second.pub_id 
      AND First.user_id = Second.user_id 
     ) 
     GROUP BY 
     COALESCE(First.exchange_id, Second.exchange_id) 
     ,COALESCE(First.pub_id, Second.pub_id) 
; 

下面是我看到的結果:

DEAL_ID EXCHANGE_ID PUB_ID INCREMENTAL FIRST_IMPS SECOND_IMPS 
/N   4    1780  0    0    15 
/N   4    1560  0    0    32 
3389  4    1780  2    7    6 
1534  4    1560  4    9    8 

,這裏是我想看到的內容:

DEAL_ID EXCHANGE_ID PUB_ID INCREMENTAL FIRST_IMPS SECOND_IMPS 
3389  4    1780  2    7    21 
1534  4    1560  4    9    40 

凡有結果null deal id與基於exchange_id和pub_id的非空交易ID相匹配。

我該怎麼辦?

編輯: 澄清 - 我輸入的查詢是我的原始查詢的簡化,它需要兩個單獨的選擇語句,因爲我正在與另一個事件表進行聯合。我沒有在這裏展示它,因爲它與Full Join問題上的聚合無關。 此外,增量值正在嘗試計算出現在deal_id> = 1中且不存在於deal_id = 0中的用戶(完全加入的另一個原因)。

回答

0

您的查詢似乎過於複雜。您可以使用條件爲聚集查詢:

select min(case when l.deal_id >= 1 then l.deal_id end) as deal_id, 
     l.exchange_id, l.pub_id, 
     count(distinct case when l.deal_id >= 1 then l.user_id end) as incremental, 
     sum(case when l.deal_id >= 1 then 1 else 0 end) as imps_1, 
     sum(case when l.deal_id = 0 then 1 else 0 end) as imps_0 
from logs l 
where l.event_type = 'TRUE' 
group by l.exchange_id, l.pub_id; 

唯一列,我不知道是deal_id。但這似乎是你想要的邏輯。

+0

感謝您的回覆!我輸入的查詢是我的原始查詢的簡化,它需要兩個單獨的選擇語句,因爲我正在與另一個事件表進行聯合。我沒有在這裏展示它,因爲它與Full Join問題上的聚合無關。 此外,_incremental_值正試圖計算出現在deal_id> = 1且不存在於deal_id = 0(完全連接的另一個原因)中的用戶,我不認爲此查詢反映了這一點。 (我編輯了我的問題以幫助澄清) – LMP

+0

@LMP。 。 。這個查詢明確地計算了「增量」值(根據您的定義)。我不知道其他「事件」表可能在做什麼。只能解決被問到的問題。 –

+0

我相信你的增量定義包括在它的計數的情況下user_id也出現在l.deal_id = 0,我想只計數不同的情況,其中user_id不存在於deal_id = 0但存在於deal_id> = 1 – LMP

相關問題