2016-06-14 13 views
1

私は以下の表を持っている:別のテーブルに存在するテーブルの行の%を検索していますか?

Table A: 

entryDate    memberID   course 

各MEMBERIDは同じ日の間に複数回発生する可能性があります

2016-05-10  1192875   STAT-2294 

2016-05-10  3292875   STAT-2294 

2016-05-10  1192875   ENG-115 

表BがAである私が探している何memberIDs

でのみ構成されてい特定の日に表Bに存在する表AのメンバーIDの%を見つける方法。

私がこれまでにだ場所です:

SELECT entryDate, 
     Count(CASE 
       WHEN tableA.memberID IN (SELECT memberID 
             FROM tableB) THEN 1 
       ELSE 0 
      END) AS membership 
FROM tableA 
WHERE entryDate BETWEEN ‘2016-05-01’ AND ‘2016-05-15’ 
GROUP BY entryDate; 

私は出発点として、生の数を取得しようとしているが、私は

サポートされていない副問合せ式 'は、次のエラーを取得MEMBERID ':現在サブクエリ 式は唯一の句が

    を述語どことして許可されています10
  • 現在のクエリで何が問題になっていますか?
  • 特定のentryDateのTableBに存在するTableAの行の%を取得するにはどうすればよいですか?

TIA! -Creig

+0

私は以下の回答に同意しますが、あなたの*エラーメッセージに直接応答は、*あなたには、いくつかのブラケットを逃しているということです。サブクエリは角括弧を必要とするので、IN文も同様に次のコードブロックを返します。 – MatBailie

答えて

5

existsを使用してこれを行うことができます。

select count(*) 
from tableA a 
where exists (select 1 from tableB b where a.memberID = b.memberID) 
and entryDate BETWEEN '20160501' AND '20160515' 

%エントリを取得するには、

select 100.0 * count(*)/(select count(*) 
          from tableA a 
          where exists (select 1 from tableB b where a.memberID = b.memberID) 
          and entryDate BETWEEN '20160501' AND '20160515') 
from tableA 
where entryDate BETWEEN '20160501' AND '20160515' 

編集:相関サブクエリが、これはleft joinで行うことができ、ハイブではサポートされていません。

select 100.0 * count(b.memberID)/count(a.memberID) 
from tableA a 
left join tableB b on a.memberID = b.memberID and a.entryDate BETWEEN '20160501' AND '20160515' 
+0

ありがとう@vkp、%クエリでこのエラーが発生しました:ParseException line 1:27私は間違って何をしているのですか? – Craig

+0

Hiveでは相関サブクエリがサポートされていないため、エラーメッセージが表示されます。回答を編集します'left join'を使用する。 –

+0

@ Craig ..編集がうまくいくかどうか –

4

私はLEFT JOINが最も簡単な方法だと思います。 tableBを仮定しても、重複を持っていない:

SELECT entryDate, COUNT(*) as numA, 
     COUNT(b.memberId) as numB, 
     AVG(CASE WHEN b.memberId is not null THEN 1.0 ELSE 0.0 END) as ratio 
FROM tableA a LEFT JOIN 
    tableB b 
    ON a.memberId = b.memberId 
WHERE entryDate BETWEEN '2016-05-01' AND '2016-05-15' 
GROUP BY entryDate; 
関連する問題