Присоединяйтесь, чтобы получить последнюю дату с меньшим или равным значением

# #sql #google-bigquery

Вопрос:

у меня есть 2 стола. первая таблица-total_payment, а вторая таблица-Schedule_down.

итого выплат

ID дата платежа накопленный_тотал_платеж
ААА 2020-01-12 105
ААА 2020-01-13 110
ААА 2020-01-14 120
ААА 2020-01-15 125
ААА 2020-01-16 125
ААА 2020-01-17 150

Schedule_down

ID Расписание дат график платежей
ААА 2020-01-11 110
ААА 2020-01-13 120
ААА 2020-01-15 130
ААА 2020-01-16 140
ААА 2020-01-18 150

как я могу присоединиться из таблицы total_payment к Schedule_down, чтобы получить расписание последних дат на основе накопленного итого платежа

мой ожидаемый результат таков

ID дата платежа накопленный_тотал_платеж Расписание дат
ААА 2020-01-12 105 2020-01-11
ААА 2020-01-13 110 2020-01-11
ААА 2020-01-14 120 2020-01-14
ААА 2020-01-15 125 2020-01-15
ААА 2020-01-16 125 2020-01-15
ААА 2020-01-17 150 2020-01-18

кто-нибудь может помочь ? Огромное спасибо!

Ответ №1:

Попробуйте следующий подход

 select any_value(tp).*, min(sd.Date_schedule) Date_schedule
from total_payment tp
join Schedule_down sd
on tp.ID = sd.ID 
and accumulated_total_payment <= payment_schedule
group by to_json_string(tp)          
 

если применить к образцам данных в вашем вопросе — вывод будет

введите описание изображения здесь

Ответ №2:

Вы можете использовать lead() и join :

 select p.*, sd.Date_schedule
from total_payment p left join
     (select sd.*,
             lead(Date_schedule) over (partition by id order by Date_schedule) as next_Date_schedule
      from schedule_down sd
     ) sd
     on p.id = sd.id and
        p.date >= s.Date_schedule and
        (p.date < s.next_Date_schedule or s.next_Date_schedule is null);
 

В принципе, это помещает дату «окончания» в каждую schedule_down строку, а затем использует ее для сопоставления.