Eine Methode ist nur zu erweitern a
, um eine Zeile für jeden Tag zu haben.
Eine andere Methode besteht darin, eine Interleaving-Technik zu verwenden. Dies setzt voraus, dass a
die Zeit wirklich partitioniert, so dass es keine Überlappungen oder Lücken gibt. Und das b
hat einen Primärschlüssel.
Also, für jeden id
in b
können Sie die entsprechende Startzeit in a
erhalten:
select id, time, max(starttime) over (order by time, priority) as a_starttime
from ((select b.id, b.time, null as starttime, 2j as priority from b) union all
(select null, a.starttime, a.starttime, 1 as priority from a)
) ab;
Dann können Sie diese mit einem Equijoin verwenden:
select id, time, a.starttime, a.endtime
from (select id, time, max(starttime) over (order by time, priority) as a_starttime
from ((select b.id, b.time, null as starttime, 2j as priority from b) union all
(select null, a.starttime, a.starttime, 1 as priority from a)
) ab
) ab join
a
on ab.a_starttime = a.starttime;
Hinweis: Diese Technik funktioniert hat gut auf anderen Datenbanken. Ich hatte nicht die Gelegenheit, es auf Hive zu versuchen.
Vielen Dank für Ihre Antwort! In der Tat, es gibt viele Felder in zwei Tabellen, die Verwendung von Interleaving-Technik sieht wie lästig und unbequem aus, ist es richtig? Gibt es einen anderen Weg für diesen Fall? – Guo
@Guo. . . Nicht dass ich in Hive leicht daran denken kann. –