2017-04-17 2 views
-1

I 2 Tabellen in HIVE zu verbinden versuchen mit ein Schlüssel und das Datum aus der Tabelle B und dievorheriges nächstes Datum Datensatz aus der Tabelle zum Zeitpunkt der Join A entspricht. Zum Beispiel: Im Folgenden sind die zwei Eingänge TabellenHive verbinden das Datum wiese Bild zu bekommen

<----------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 

Allerdings, wenn ich die Tabelle B JOIN mit der Tabelle A für das nächste niedrigste Datum in Tabelle A für den gleichen Schlüssel (A_Id) aussehen sollte. Unten ist die erwartete Ausgabetabelle:

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 

Jede Hilfe wird sehr geschätzt. Dank

+0

Ist die Kombination von B_id und B_date eindeutig? –

Antwort

0

die Abfrage durchschaut hat mich

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 

Sie können die gewünschten Spalten in Zeile 1 Vorerst wählen habe ich ausgewählt alle Spalte von A und B einschließlich dem Rang.

+0

Nicht ein LINKER JOIN :-) –

+0

Sorry, korrigiert den qs Inhalt :) Danke für das Aufzeigen – anna

-2

Es könnte möglich sein, indem Sie where Bedingungen auf Daten aus zwei Tabellen mit Teilstring-Funktion angeben.

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

Sie zusätzliche Bedingung in dieser where Klausel mit AND je nach gefordertem Abschlussdatum Spezifikation hinzufügen können.