我正在尝试使用表B中的键和日期以及加入时 对应的表A 中最近的最接近日期记录来加入HIVE中的2个表格。例如:下面是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
但是当我用表A加入表B时,它应该在表A中查找相同键(A_id)中最接近的最低日期。以下是预期的输出表:
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 :(得分:0)
自己想出查询
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
您可以在第1行中选择所需的列。现在,我已选择A和B中的所有列,包括排名。
答案 1 :(得分:-2)
可以通过使用子字符串函数在两个表的日期上指定where
条件来实现。
where a.substring(A_date,1,7) = b.substring(B_date,1,7)
您可以使用where
在此AND
子句中添加其他条件,具体取决于所需的结束日期规范。