2016-08-06 4 views
0

私は、外部クエリに依存する不等式条件を持つ内部クエリを持つ次のクエリを持っています。 HIVEは、内部クエリからの外部クエリを不等式条件で参照することをサポートしていないようです。この質問をHIVEに書くにはどうすればいいですか?ハイブで不等式条件を持つ内部クエリを使用する方法

SELECT 
* 
FROM  
A 
WHERE NOT EXISTS 
(
SELECT * 
FROM 
    B 
WHERE 
    B.cust_id = A.cust_id 
    AND datediff(A.year_month, B.year_month) < 365 * 3 
) 

答えて

0

使用している機能はHiveではサポートされていません。クエリを書き換えることは可能です:

SELECT * 
    FROM A 
     LEFT JOIN B ON B.cust_id = A.cust_id 
    WHERE (datediff(A.year_month, B.year_month) >= 365 * 3) --note >= here 
     OR B.cust_id is NULL --is not joined 
+0

ここでの結果はまったく同じではありません。 'B'テーブルに複数の行があり、過去3年間にいくつかの行があり、その前には何が起こっているのかを考えてみましょう。 –

+0

はい、あなたは正しいです、それはデータによって異なります。 LEFT JOINは行を複製できます。重複を削除するには、row_numberまたはgroup byを適用する必要があります。 – leftjoin

0

Will Hiveはこのクエリを受け入れますか?

SELECT ab.* 
FROM (SELECT a.*, b.min_year_month 
     FROM a JOIN 
      (SELECT b.cust_id, MAX(b.year_month) as min_year_month 
      FROM b 
      GROUP BY b.cust_id 
      ) b 
      ON a.cust_id = b.cust_id 
    ) ab 
WHERE datediff(A.year_month, B.min_year_month) < 365 * 3; 

論理が正しいと思います。これにより、Bのすべてのレコードが過去3年間のものであるAのすべてのレコードが返されます。

重要なアイデアは、集計とサブクエリを使用して必要なデータを取得することです。

実際にレコードをBにも記録したい場合は、別のJOINを使用してレコードを取得してください。

+0

INNER JOINのため、クエリが正しい結果を生成しません。 Bにa.cust_id = b.cust_idのレコードが含まれていない場合はどうしますか。 – leftjoin

+0

私は過去3年間レコードを持っていないレコードを探しています。レコードに過去3年間のレコードと過去5年間のレコードがある場合、クエリは最も内側のサブクエリの過去5年間のレコードを考慮し、そのレコードに基づいて動作します。 –

+0

@ H.Z。 。 。 。私は、ロジックが正しいものになるようにクエリを調整しました。 –

関連する問題