2017-04-17 5 views
-1

を取得するために参加します。例:以下は、私は表Aと表Bに参加するときしかし、同じキー(A_ID)の表Aに最も近い最低の日付を探すべき2つの入力テーブルハイブは、私は、テーブルBと結合する時に最も近い以前の日付のレコードをテーブルから</strong>対応</strong><strong>から<strong>キーと日付を使用してHIVEで2つのテーブルを結合しようとしています日付賢明な絵

<----------TABLE A------------->   <------------TABLE B------------> 
A_id A_date  changed_col    B_id B_date  B_value A_id 
**** ******  ***********    **** ******  ******* ***** 
A01  2017-03-20  ABC     B01  2017-04-02 200  A01 
A01  2017-04-01  XYZ     B01  2017-04-04 500  A01 
A01  2017-04-05  LLL     B02  2017-04-07 900  A02 
A02  2017-04-06  KKK     B02  2017-04-30 800  A02 
A02  2017-04-12  JJJ 

あります。以下は予想される出力表です。

B_id B_date   A_id  A_date  changed_col B_value 
**** ******   ****  ******  *********** ******* 
B01  2017-02-04  A01  2017-01-04  XYZ    200 
B01  2017-04-04  A01  2017-01-04  XYZ    500 
B02  2017-04-07  A02  2017-04-06  KKK    900 
B02  2017-04-30  A02  2017-04-12  JJJ    800 

何か助けてください。おかげ

+0

B_idとB_dateの組み合わせは一意ですか? –

答えて

0

は、あなたが、私はランクを含むAとBからすべての列を選択している今のライン1で必要な列を選択することができ、自分

select * from 
(select b.*, a.*, 
row_number() over (partition by b.a_id, b.b_date 
order by b.b_date, datediff(to_date(b.b_date), to_date(a.a_date))) as rnk 
FROM b JOIN a 
ON b.a_id= a.a_id 
WHERE a.a_date <= b.b_date 
) j1 where j1.rnk = 1 

B_id B_date   B_value A_id   A_date  changed_col rnk 
B01  2017-04-02  200  A01  A01  2017-04-01  XYZ  1 
B01  2017-04-04  500  A01  A01  2017-04-01  XYZ  1 
B02  2017-04-07  900  A02  A02  2017-04-06  KKK  1 
B02  2017-04-30  800  A02  A02  2017-04-12  JJJ  1 

クエリを考え出しました。

+0

LEFT JOIN :-) –

+0

申し訳ありませんが、内容を修正しました:)指摘ありがとう – anna

-2

部分文字列関数を使用して2つのテーブルの日付に条件を指定することで可能です。

where a.substring(A_date,1,7) = b.substring(B_date,1,7)

、必要な近い日付の仕様に応じてANDでこれwhere句で条件を追加することができます。

関連する問題